gpt4 book ai didi

java - 如何在 Java Swing 中制作不不断改变/闪烁颜色的简单动画形状?

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

我有一些为了好玩而编写的代码,可以绘制不同颜色的圆圈线。在不使用 Swing Timer 的情况下,圆圈会“一次性”绘制,并且它们的颜色会在红色、绿色、蓝色和黄色之间交替。因此,如果没有计时器,代码将按预期工作。然而,当我尝试制作动画以便可以看到正在绘制的圆圈时,这意味着使用 Swing Timer 进行循环而不是 while/for 循环,所有圆圈都具有相同的颜色,并保持四种颜色一起闪烁。我想问题是颜色与每个对象无关,而是与整个框架相关联,因为我每隔几毫秒更改一次框架的颜色,已经绘制的圆圈不会像它们那样保留其原始颜色while 循环。如果您看到任何解决方案,我们将不胜感激!代码如下:

public class Board extends JPanel {

private static final long serialVersionUID = 6676924870723702476L;

private Timer timer;
private final int DELAY = 30;

private ActionListener drawLine;
private Ellipse2D circ;
private ArrayList<Ellipse2D> circles = new ArrayList<>();

private double circDiam = 80;
private double circX = 0;
private double circY = 0;
private short circNum = 1;

public Board() {

drawLine = (ActionEvent e) -> {

repaint();

circX += circDiam;

if(circNum == 5)
{
circNum = 1;
}
};

timer = new Timer(DELAY, drawLine);
timer.start();
}

private Color getCircColor(short circNum) {
switch(circNum) {
case 1:
return Color.blue;
case 2:
return Color.red;
case 3:
return Color.yellow;
case 4:
return Color.green;
default:
return Color.gray;
}
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

Dimension size = new Dimension(getWidth(), getHeight());
double width = size.getWidth();
double height = size.getHeight();

Graphics2D g2d = (Graphics2D) g;

RenderingHints rHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rHints);

if(circX >= width - circDiam)
{
circY += circDiam;
circX = 0;
circDiam *= 0.865 ;
}

if(circY >= height - circDiam) {
timer.stop();
}

circ = new Ellipse2D.Double(circX, circY, circDiam, circDiam);
g2d.setColor(getCircColor(circNum));
circNum++;
circles.add(circ);

for(Ellipse2D circ : circles) {
g2d.fill(circ);
}
}

}

public class Execute extends JFrame {

private static final long serialVersionUID = -3483390877436935589L;

public Execute() {

add(new Board());

setSize(800, 800);
setResizable(false);

setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {

EventQueue.invokeLater(() -> {
Execute ex = new Execute();
ex.setVisible(true);
});
}
}

最佳答案

绘画方法仅用于绘画。它不应该:

  1. 创建对象。也就是说,不要创建 Circle 对象。
  2. 停止计时器。
  3. 绘制代码将简单地迭代 ArrayList 以绘制所有 Cirlce 对象。

定时器的 ActionListener 用于:

  1. 创建 Cirlce 对象并将它们一次一个地添加到 ArrayList 中。
  2. 确定每个对象的颜色
  3. 创建所需数量的对象后停止计时器。

所以基本上在您的 Board 类中,您需要一个像 addCircle(....) 这样的方法。这会将 Circle 对象添加到 ArrayList,然后对其自身调用 repaint()。然后,您可以更改 ActionListener 代码来创建 Circle 对象并调用 addCirle(...) 方法。

I guess the problem is color is not associated with each object

正确。您将需要一个自定义对象来进行绘画。这个自定义对象将包含两个属性:

  1. 圆形对象
  2. Circle 对象的颜色。

或者另一个选项是直接绘制到 BufferedImage,然后在面板中显示 BufferedImage。

参见Custom Painting Approaches例如这两种绘画方法。

关于java - 如何在 Java Swing 中制作不不断改变/闪烁颜色的简单动画形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168783/

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