gpt4 book ai didi

java - 使用 repaint() 的动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:13 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的动画,它在按下按钮时绘制随机矩形。到目前为止,我设法通过按下按钮创建了矩形。我想进一步开发代码,以便在按下按钮时创建多个随机矩形。我试图创建一个 for 循环,要求内部类重新绘制自身,但它仍然不起作用。谁能帮帮我。

    public class TwoButtonsRandomRec {

JFrame frame;
private int width = 500;
private int height = 500;
private DrawPanel dp;

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}


public static void main (String[] args)
{
TwoButtonsRandomRec test = new TwoButtonsRandomRec();
test.go();
}

public void go()
{
dp = new DrawPanel();

JButton start = new JButton("Start");
start.addActionListener(new startListener());
JButton stop = new JButton("Stop");
stop.addActionListener(new stopListener());

frame = new JFrame();
frame.setSize(getWidth(), getHeight());
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.NORTH, start);
frame.getContentPane().add(BorderLayout.SOUTH, stop);
}

class startListener implements ActionListener{
public void actionPerformed(ActionEvent event){
frame.getContentPane().add(BorderLayout.CENTER, dp);
frame.repaint();
frame.getRootPane().revalidate();
for(int i=0; i<10; i++){
dp.repaint();
}
}
}

class stopListener implements ActionListener{
public void actionPerformed(ActionEvent event){
System.out.println("stop");
}
}

class DrawPanel extends JPanel{

public void paintComponent(Graphics g){
int w = 5+(int)(Math.random() * width-5);
int h = 5+(int)(Math.random() * height-5);
int maxX = width-w; // diffX & diffY are used to ensure that rectangle is
int maxY = width-h; // draw completely inside the window
int x = (int)(Math.random() * maxX);
int y = (int)(Math.random() * maxY);
Color color = new Color((int) (Math.random()*256), // random red
(int) (Math.random()*256), // random green
(int) (Math.random()*256));// random blue
g.setColor(color);
g.fillRect(x,y,w,h);
}
}
}

最佳答案

repaint() 简单地告诉 Swing “当你有时间的时候,请重新绘制这个区域”。因此,如果您在循环中添加矩形并在每次迭代时调用 repaint,则所有矩形只会在循环结束且 Action 事件已被处理后出现。

要制作动画,您需要在单独的线程中循环。最简单的方法是使用 Swing Timer .当“开始”按钮启动时,启动一个计时器,它会添加一个随机矩形并每 X 毫秒调用一次 repaint()。按下停止按钮时,停止计时器。

关于java - 使用 repaint() 的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090857/

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