gpt4 book ai didi

Java 使用 revalidate() 和 repaint() 无法正常工作

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

所以我尝试创建一个框架来执行 Diashow,但由于某种原因,我只能看到一个空框架,在一切完成后,我看到最后一张图片。我想要看到的是每张图片之间都有大约 1 秒的停顿。我按照我认为的工作方式使用了 revalidate()/repaint() ,但我相当确定问题就在那里,因为我想不出其他原因。

我才刚刚开始学习 Java.Swing,因此非常欢迎任何意见来提高我的技能。正如我已经说过的,我认为问题出在我对 revalidate() 的使用上,但我无法单独通过 google 修复它..

作为类的输入,我使用 BufferedImage 数组,我想为其创建 diashow。

我还尝试将图像直接放在我的 Container c 上,而不是放在 JPanel p 上,但无论我想要什么方式,它都不起作用。

public class DiashowFrame extends JFrame {

Container c;
JPanel p;

public DiashowFrame(JFrame father,BufferedImage [] image) {
c= getContentPane();
c.setLayout(new FlowLayout());
p = new JPanel();
p.setLayout(new FlowLayout());
p.setSize(500,500);
c.add(p);

setSize(500,500);
setLocation(father.getX(),father.getY());
setVisible(true);
dia(p,image);

}

public static void dia(JPanel p,BufferedImage[] image) {

JLabel def= new JLabel(new ImageIcon(image[0]));
p.add(def);
//c.repaint();
p.revalidate();
for(int x=1;x<image.length;x++) {

try {

TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//p.removeAll();
//p.revalidate();
Image imager = image[x].getScaledInstance(500, 500, 100);
def = new JLabel(new ImageIcon(imager));
p.add(def);
p.revalidate();
//p.repaint();

}

}

}

最佳答案

首先查看 Concurrency in Swing .

与大多数 GUI 框架一样,Swing 是单线程的并且不是线程安全的。

这意味着从事件调度线程内执行的任何长时间运行或阻塞操作都将阻止 EDT 处理事件队列并以任何方式更新 UI。

虽然您可以使用Thread 将等待时间转移到第二个线程,但 Swing 不是线程安全的,这意味着您永远不应该从上下文外部直接或间接更新/修改 UI美国东部时间。

您的情况最简单的解决方案是简单地使用 Swing Timer。这允许您指定更新之间的延迟(以及是否重复),该延迟在 EDT 之外执行,但在触发时会在 EDT 上下文中收到通知,从而使 Swing 的使用变得简单、安全。

Timer 充当伪循环,Timer 的每次触发代表下一次迭代

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

关于Java 使用 revalidate() 和 repaint() 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253092/

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