我有下面的程序,当它运行时有一些非常奇怪和不想要的行为。 。它应该有两个按钮,“开始”和“停止,但是当我点击‘开始’另一个按钮显示了下方的‘开始’这里是打印屏幕什么我谈论:奇怪的JFrame行为
什么我做错了,我怎么解决这个难看的问题
下面的代码:?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class TwoButtonsTest {
JFrame frame;
Timer timer;
boolean isClicked;
public static void main(String[] args) {
TwoButtonsTest test = new TwoButtonsTest();
test.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
JButton startButton = new JButton("Start");
startButton.addActionListener(new StartListener());
JButton stopButton = new JButton("Stop");
stopButton.addActionListener(new StopListener());
final DrawPanel myDraw = new DrawPanel();
frame.getContentPane().add(BorderLayout.CENTER, myDraw);
frame.getContentPane().add(BorderLayout.NORTH, startButton);
frame.getContentPane().add(BorderLayout.SOUTH, stopButton);
frame.setVisible(true);
timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
myDraw.repaint();
}
});
}
class StartListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//needs to be implemented
if(!isClicked) {
}
isClicked = true;
timer.start();
}
}
class StopListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
//needs to be implemented
timer.stop();
isClicked = false;
}
}
class DrawPanel extends JPanel {
public void paintComponent(Graphics g) {
int red = (int)(Math.random()*256);
int blue = (int)(Math.random()*256);
int green = (int)(Math.random()*256);
g.setColor(new Color(red, blue, green));
Random rand = new Random();
// following 4 lines make sure the rect stays within the frame
int ht = rand.nextInt(getHeight());
int wd = rand.nextInt(getWidth());
int x = rand.nextInt(getWidth()-wd);
int y = rand.nextInt(getHeight()-ht);
g.fillRect(x,y,wd,ht);
}
} // close inner class
}
而且我试图让开始按钮做两件事情之一是的当然开始动画,但是当按下停止按钮时,我按下再次开始,我希望它能够清理屏幕,然后再次开始动画。任何提示呢?
如果我做super.paintComponent(g),每次调用paintComponent都不会刷新屏幕吗?这不是我想要做的事情。或者我对我的理解错了吗? –
@nickecarlo当然你想要重画屏幕,并且你可以看到如果你不叫它会发生什么。唯一可能发生的问题是你的图形将被擦除,通过使它们持久化,即将所有要绘制的矩形添加到一个ArrayList并迭代'paintComponent'上的数组,这样它们将在每次屏幕显示时重绘 –
感谢您的意见。我也赞同你的回答。我会尝试两种答案,并接受最好的作品。 –