gpt4 book ai didi

java - (多图)动画Java

转载 作者:行者123 更新时间:2023-12-02 11:10:37 25 4
gpt4 key购买 nike

我的程序中有一组节点,每个节点都有一个特定的 x,y 位置。每个都有一组图像图标。

我想为每个节点在其特定位置绘制图像动画。

这是我的代码:(这仅显示最后一张图像,我知道为什么!。)

public void showPicture()  {
//nodes :
for(int i=0;i<thisGraph.getNode().size();i++){
if(thisGraph.getNode().get(i).getImageIcon()!=(null)){
for(int j=0;j<thisGraph.getNode().get(i).getImageIcon().size();j++){
if(j>0)
lables.get(lables.size()-1).setVisible(false);
JLabel jLabel1 = new JLabel();
lables.add(jLabel1);
jLabel1.setLayout(new GridBagLayout());
jLabel1.setIcon(thisGraph.getNode().get(i).getImageIcon().get(j));
jLabel1.setVisible(true);
jLabel1.setBounds((int)thisGraph.getNode().get(i).getX(),(int)thisGraph.getNode().get(i).getY(),195,163);
jPanel1.add(jLabel1);

}
}
}
}

此方法 showPicture() 在 ButtonActionListener 中调用。我还有另一个按钮,我希望它能够停止所有标签的图像动画。

我尝试过的:Thread.sleep() -> 它卡住按钮并且只显示最后一个图像

我认为我必须使用计时器,但在我讨论的所有主题中,他们只在一个标签上使用它,而不是在多个标签上使用它。

编辑->我读了评论中给出的那些例子。这是我已经解决的问题,但它仍然卡住按钮并且不起作用:

int j = 0;
public void showPicture(){
//nodes :
for(int i=0;i<thisGraph.getNode().size();i++){
if(thisGraph.getNode().get(i).getImageIcon()!=(null)){
j=0;
while( j<thisGraph.getNode().get(i).getImageIcon().size()){

if(j>0)
lables.get(lables.size()-1).setVisible(false);
JLabel jLabel1 = new JLabel();
lables.add(jLabel1);
jLabel1.setLayout(new GridBagLayout());
jLabel1.setIcon(thisGraph.getNode().get(i).getImageIcon().get(j));
jLabel1.setVisible(true);
jLabel1.setBounds((int)thisGraph.getNode().get(i).getX(),(int)thisGraph.getNode().get(i).getY(),195,163);

jPanel1.add(jLabel1);

//

ActionListener act;
act = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jLabel1.setVisible(true);
j++;
}
};
Timer timer = new Timer(1000, act );
timer.start();

timer.stop();
//

}
}
}}

最佳答案

Swing 是单线程的,并且不是线程安全的。这意味着您不应该通过长时间运行或阻塞操作(例如 Thread.sleep)来阻塞事件调度线程。您还应该只在事件调度线程的上下文中更新 UI(或其依赖的任何内容)。

参见Concurrency in Swing了解更多详情。

解决您的问题的最简单的方法可能是使用 Swing Timer

这个想法是你使用一个Timer作为“主动画循环”,改变你需要在其中更新的所有对象的属性。

以下是非常基本的示例,它为 100 个 JLabel 提供动画,只需使用随机选择的颜色更改其背景颜色

Sparkle

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private List<JLabel> nodes = new ArrayList<>(100);

private Random random = new Random();
private Color[] colors = new Color[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK, Color.MAGENTA};

public TestPane() {
setLayout(new GridLayout(0, 10));
for (int index = 0; index < 100; index++) {
JLabel label = new JLabel();
label.setBorder(new EmptyBorder(5, 5, 5, 5));
label.setOpaque(true);
label.setBackground(pickColor());
nodes.add(label);
add(label);
}
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (JLabel label : nodes) {
label.setBackground(pickColor());
}
}
});
timer.start();
}

protected Color pickColor() {
return colors[random.nextInt(colors.length)];
}

}

}

参见How to Use Swing Timers了解更多详情

关于java - (多图)动画Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649836/

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