- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图显示一个图像(ball
),我最终将通过用户输入来控制它。要知道,图像只是使用线程的 sleep 方法每隔一段时间显示一次。
我创建了 2 个类,一个扩展了 JPanel
,另一个扩展了 JFrame
。JPanel
子类如下所示:
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/
所以我试图显示一个图像(ball),我最终将通过用户输入来控制它。要知道,图像只是使用线程的 sleep 方法每隔一段时间显示一次。 我创建了 2 个类,一个扩展了 JPanel,另一个扩展了 JFr
我们在运行应用程序结束时收到此错误。我在谷歌搜索但不知道是什么原因导致这个错误以及这意味着什么。该怎么办以及如何解决? 我什至不知道是什么引发了这个异常...... Exception breakpo
这是我不明白的设计决定。 Android 和 JME 都遵循启动应用程序的线程是 UI 线程的策略,您要注意将资源消耗的东西卸载到另一个线程。 另一方面,在 Swing 中,您将 EventQueue
我使用 JEditorPane 作为“橡皮图章”将 HTML 文本呈现为 PDF。我需要文本以特定宽度换行,并且需要在文本后面应用白色“突出显示”。因此,我在 PDF 渲染线程中创建一个 JEdito
我是 Swing 的新手,正在 Eclipse 中制作一个非常基本的事件处理程序。这是我写的代码: public class SwingDemo2 { JLabel jl; public SwingD
当我尝试在调试器中启动我的代码时出现以下错误。 EventDispatchThread.run() line: not available [local variables unavailable]
不久前,我们向应用程序添加了一些代码来检测并尝试从 Swing EDT 死锁中恢复,因此用户至少可以保存他们的文件(最好不要出现死锁,但是......) 。在 Java 1.6 中,这很容易。检测 E
当 dumpStackTrace 的第一个元素位于 java.awt.EventDispatchThread.run 时,为什么 isEventDispatchThread() 返回 false?
这是我在使用 Eclipse 进行调试时遇到的一个小烦恼。选中“未捕获的异常时暂停执行”后,调试器通常会在引发异常的位置暂停线程。然而,事件调度线程上的异常会导致它在 EventDispatchThr
我是一名优秀的程序员,十分优秀!