gpt4 book ai didi

java - Swing 计时器和 Canvas 上的绘画

转载 作者:行者123 更新时间:2023-12-02 01:05:50 27 4
gpt4 key购买 nike

嗨,我想询问有关 Swing 计时器和 Canvas 的问题。我正在做简单的动画来改变对象的颜色。我用 Thread.sleep 做到了,但 JFrame 在重新绘制时没有响应,所以我将其更改为 Swing Timer。但现在,当我开始动画时,它什么都不做,计时器正在工作,但 Canvas 上的对象不会改变颜色。这是我的颜色变化动画功能,我在 Canvas 的覆盖绘画功能中使用它

    private void paintSearch(Vector<NodeGraph2D> vector,Graphics graphics2D) {
if (!vector.isEmpty()) {
final int[] k = {0};
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (repaint) {
if (k[0] == vector.size())
return;
if (vector == pruferTreeNodes) {
vector.elementAt(k[0]).draw((Graphics2D) graphics2D);
} else {
graphics2D.setColor(Color.GREEN);
((Graphics2D) graphics2D).fill(vector.elementAt(k[0]));
graphics2D.setColor(Color.BLACK);
((Graphics2D) graphics2D).drawString(vector.elementAt(k[0]).getNodeGraph().getName(), vector.elementAt(k[0]).getX1() + 15, vector.elementAt(k[0]).getY1() + 25);

}
k[0] += 1;
}
}
});
timer.start();
}
}

你认为我对定时器的使用不好吗?感谢您的回复。 :)

最佳答案

在 Swing 中进行自定义绘制时,最好对 JPanel 进行子类化(它可以是匿名类)并将与绘制相关的数据存储在面板可访问的属性中。

您的计时器不会执行任何绘画,而是操纵与绘画相关的数据。您绝对不应该尝试在 Swing 的 EventDispatcherThread 之外或 JComponent 的 PaintComponent 方法之外对图形对象进行任何绘制。 (有关更多信息,请参阅这些方法的文档)

以下是使用计时器操作颜色的自定义绘画的示例:

public static void main(String[] args) {
EventQueue.invokeLater(Example::new);
}

// this is the painting-related data that is being manipulated by the timer
private int currentColorIndex;

public Example() {
JFrame frame = new JFrame("Custom Painting");
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);

Color[] allColors = {Color.RED, Color.BLUE, Color.GREEN,
Color.YELLOW, Color.ORANGE, Color.MAGENTA};

JPanel myCustomPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
// here the painting related data is being used by the custom JPanel implementation
g.setColor(allColors[currentColorIndex]);
g.fillRect(0, 0, getWidth(), getHeight());
}
};
frame.setContentPane(myCustomPanel);

Timer timer = new Timer(100, e -> {
// the timer does not use any graphics objects, etc, but rather manipulates our painting-related data
currentColorIndex = (currentColorIndex + 1) % allColors.length;
// whenever the painting-related data has changed we need to call repaint() on our custom JPanel implementation
myCustomPanel.repaint();
});
timer.setRepeats(true);
timer.start();

frame.setVisible(true);
}

关于java - Swing 计时器和 Canvas 上的绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60076237/

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