awt如何在java中重新绘制()StrokePanel
每次我按下四个按钮中的一个,我都试图改变这个数字。
每次我运行文件时,这个数字都会改变,但我不知道在按下按钮时如何改变它
是否有一种方法可以调用以重新绘制StrokePanel,或者我必须执行其他操作
这是到目前为止的代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import javax.swing.border.LineBorder;
public class GeomtryQuiz extends JApplet{
boolean playing = true;
static int chosen = 0;
static boolean answer = false;
static boolean change = false;
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setTitle("Geometry Quiz");
frame.setSize(1024,900);
frame.setBackground(Color.white);
JApplet applet = new GeomtryQuiz();
applet.init();
JButton[] buttons = new JButton[4];
buttons[0] = new JButton("Triangle");
buttons[1] = new JButton("Square");
buttons[2] = new JButton("Pentagon");
buttons[3] = new JButton("Hexagon");
frame.getContentPane().add(applet);
Container c = frame.getContentPane();
JPanel p = new JPanel();
p.setLayout(new GridLayout(2,2));
c.setLayout(new BorderLayout());
for(int i = 0 ; i < 4; i++){
buttons[i].setPreferredSize(new Dimension(70,70));
buttons[i].setBackground(Color.pink);
final JButton b = buttons[i];
final int angle = i;
final int n = 3;
b.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
if(b.isEnabled()){
control(angle);
}
if(!b.isEnabled()){
}
}
}
);
p.add(buttons[i]);
}
c.add(p,BorderLayout.SOUTH);
c.add(applet,BorderLayout.CENTER);
frame.setVisible(true);
}
public static void control(int i){
if((i + 3) == chosen){
JOptionPane.showMessageDialog(null,"Correct");
}
else{
JOptionPane.showMessageDialog(null,"Wrong");
}
change = true;
}
public void init() {
JPanel panel = new StrokePanel();
getContentPane().add(panel);
}
class StrokePanel extends JPanel {
public StrokePanel() {
setPreferredSize(new Dimension(1024,800));
setBackground(Color.white);
}
public void paintComponent(Graphics f){
Graphics2D g = (Graphics2D)f;
Point2D center = new Point2D.Float(512,250);
float radius = 1000;
float[] dist = {0.1f, 0.2f, 1.0f};
Color[] colors1 = {Color.white, Color.white, Color.red};
RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors1);
g.setPaint(p);
g.fillRect(0,0,1024,800);
int random = (int)(Math.random()*4 + 3);
chosen = random;
drawShape(g,random);
}
public void drawShape(Graphics g,int numri_brinjeve)
{
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(2.0f));
g.setColor(Color.pink);
g2.translate(512,250);
double kendi = 360.0/numri_brinjeve;
GeneralPath path = new GeneralPath();
double a = 0;
double c = 0;
double x = 0;
double y = 0;
double r = 150;
for(int i = 1 ; i <= numri_brinjeve + 1 ; i++) {
x = r* Math.cos(Math.toRadians(i*kendi));
y = r* Math.sin(Math.toRadians(i*kendi));
a = x;
c = -y;
if(i == 1)
path.moveTo(a, c);
// System.out.println(i + ", " + a + ", " + c + "," + i*kendi);
path.lineTo(a, c);
}
g2.fill(path);
g2.setColor(Color.lightGray);
Stroke stroke = new BasicStroke(7);
g2.setStroke(stroke);
g2.draw(path);
}
}
}
# 1 楼答案
您需要调用
repaint
来触发新的绘制周期观察
extends JApplet
是令人困惑的事情。一般来说,您不应该自己创建和操作Applet
,它们应该由浏览器插件管理基于你的代码,我看不出有什么真正的理由拥有它,所以我先把它扔掉
现在,这将开始产生额外的问题,突出了您可能遇到的问题
好的,那么您首先将
applet
添加到内容窗格,然后再添加它。。。?在这种情况下,这实际上是一个no操作,但可能会导致无止境的问题,请确保只添加一次组件但这就引出了下一个问题:用什么来代替applet?好的,因为applet所做的唯一一件事就是向它添加
StrokePanel
,所以它很简单,只需使用StrokePanel
这就是事情变得更复杂的地方
基本上,
StrokePanel
需要保持它的当前状态,因此chosen
实际上应该是StrokePanel
的一个属性,而且chosen
不应该从paintComponent
中修改,这将导致问题不断,因为paintComponent
可以在任何时候出于任何原因被调用,大多数情况下都不需要您的参与。因此,您需要一些方法来设置和获取该值StrokePanel
GeomtryQuiz
我没有对此做过一点重新的工作,主要是,我删除了
JApplet
,并将核心应用程序移出了static
上下文(pet hate)主要更新包括
update
方法,该方法生成随机形状并更新StrokePanel