gpt4 book ai didi

java - 单击按钮后重复重新绘制面板

转载 作者:行者123 更新时间:2023-12-02 04:26:58 26 4
gpt4 key购买 nike

我正在尝试编写一个有两个按钮的程序,每当我按下第一个按钮时,正方形就会一遍又一遍地重新绘制,并在按下第二个按钮时改变它的颜色。但它只重画一次:(如果有人可以提供帮助,我将不胜感激。

class Squre {
JFrame frame;
JButton button1;
JButton button2;
MyPanel panel;

public static void main(String[] args){
Squre s= new Squre ();
s.go();

}
public void go(){
frame = new JFrame();
panel= new MyPanel();
button1= new JButton();
button2= new JButton();

button1.setText("START");
//button1.setSize(30, 20);
frame.setVisible(true);
frame.setSize(700,700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER ,panel);// add panel
frame .getContentPane().add(BorderLayout.WEST, button1);// add the west button
frame .getContentPane().add(BorderLayout.EAST, button2);//ADD THE EAST BUTTON
button1.addActionListener(new StrListener());
button2.setText("EXPLOSION");
button2.addActionListener(new ExpListener());
}
private class StrListener implements ActionListener{

public void actionPerformed(ActionEvent e){
do{
frame.repaint();

}
while(e.equals(button2)==true);
}
}
private class ExpListener implements ActionListener{
// @Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}class MyPanel extends JPanel{
public void paintComponent(Graphics g){
g.fillRect(0,0,this.getWidth(),this.getHeight());

int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color rn=new Color(red, green, blue);
g.setColor(rn);
g.fillRect(250, 250, 50, 50);



}
}}

最佳答案

e.equals(button1) // event not equal to a button

e.equals(button1) 永远不会变为 true,因为 event 不等于 button。但是 repaint 运行一次,因为它是一个 do while 循环。

你应该使用

e.getSource().equals(button1);

检查单击的按钮是否为button1

但即使您使用e.getSource().equals(button1),您也不会看到颜色按预期变化。如果您在 EDT 内运行这个耗时的 while 循环,您将阻塞 EDT 线程。因此颜色不会改变,但如果您放置 sout,您将看到循环不断运行。您可以使用 swing timer为了这。 Swing 计时器不会阻塞 EDT。

使用 Swing 计时器......

你应该导入swingtimer//import javax.swing.Timer;

private class StrListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(button1)) {
Timer t = new Timer(100, new ActionListener() {

@Override
public void actionPerformed(ActionEvent ae) {
frame.repaint();
}
});
t.start();
}
}
}

enter image description here

关于java - 单击按钮后重复重新绘制面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com