gpt4 book ai didi

java - 使用 EventDispatchThread 与不使用 EventDispatchThread 显示图像

转载 作者:行者123 更新时间:2023-12-02 04:30:32 25 4
gpt4 key购买 nike

所以我试图显示一个图像(ball),我最终将通过用户输入来控制它。要知道,图像只是使用线程的 sleep 方法每隔一段时间显示一次。

我创建了 2 个类,一个扩展了 JPanel,另一个扩展了 JFrameJPanel 子类如下所示:

 public class BallPanel extends JPanel {
private Image ball;
private int x,y;
public BallPanel(){
try {
ball=ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\ball.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
x=10;
y=10;
Thread thread = new Thread() {
@Override
public void run(){
loop();
}
};
thread.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(ball,x,y,null);
}
public void loop(){
while(true){
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

在循环方法中,我调用 sleep 方法以允许按时间间隔调用 repaint。然后,在构造函数中调用loop()

JFrame 子类如下所示:

    public class BallFrame extends JFrame {

public BallFrame(){
setVisible(true);
setSize(800,800);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(new BallPanel());
}
public static void main(String args[]){
//SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run() {
new BallFrame();
// }
//});

}
}

现在有趣的,或者可能令人困惑的事情是,当我运行此处所示的代码时,并注释掉匿名内部类,球并不总是出现。有时我需要在显示球之前重新调整框架大小(即调用repaint)。但是,当我使用匿名内部类通过偶数调度线程调用它时,每次运行代码时都会出现球。这是什么原因?

最佳答案

这与是否从 EDT 内启动 UI 没有什么关系(尽管您应该导致这可能导致许多其他奇怪且有趣的问题),而更多地与您调用 setVisible 的事实有关。在建立 UI 的内容之前。

这可能是系统尝试启动并运行 EDT 与操作系统调用在 EDT 建立之前做出响应之间的竞争条件示例。

无论哪种情况,您都应该从 EDT 中启动 UI 并调用 setVisible最后。

Swing 可能会懒于更新 UI,这实际上是一个深思熟虑的设计选择,也是一个好主意。您并不总是希望在每次更改(例如添加/删除组件)后更新 UI,因此它将一些控制权交给开发人员来决定何时最好 revalidate容器层次结构和请求repaint

我也会避免使用 Thread更新 UI 的状态,因为这可能会导致脏漆,因为 Swing 使用被动渲染方法(在需要时进行绘制)并考虑使用 Swing Timer从 EDT 内更新或使用 BufferStrategy并采用主动渲染方法,然后您可以控制

关于java - 使用 EventDispatchThread 与不使用 EventDispatchThread 显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529180/

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