Tag: event dispatch thread

JLabel在睡觉前没有出现

我正在研究一个简单的Swing程序,它在框架上放置一个标签,睡眠一秒钟,然后在框架上放置另一个标签,如下所示: import javax.swing.*; import java.util.concurrent.*; public class SubmitLabelManipulationTask { public static void main(String[] args) throws Exception { JFrame frame = new JFrame(“Hello Swing”); final JLabel label = new JLabel(“A Label”); frame.add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 100); frame.setVisible(true); TimeUnit.SECONDS.sleep(1); SwingUtilities.invokeLater(new Runnable() { public void run() { label.setText(“Hey! This is Different!”); } }); } } 但是,我无法在睡眠前看到屏幕上的第一个标签。 睡觉时屏幕是空白的。 之后,我看到了原始标签的瞬间,然后是最后的标签“嘿!这是不同的!” 在屏幕上。 […]

必须在EDT中调用AWT类中的所有方法,即非Swing方法吗?

我最近了解到Sun的/ Oracle最新指南说,任何Swing对象(包括构造函数)的Swing方法都不能在EDT之外调用。 相同的严格标准是否也适用于所有“视觉”AWT课程? 如果没有,**对他们来说是什么规则? 后来 re Swing和EDT:2009年的讨论。 http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-swing-components-on-the-edt.html 引用:“除了实际的线程安全性以及可见性和同步等相关问题之外,我认为还有软件问题。Swing组件通常具有某种类型的”监听器“,而这些监听器设计为在EDT上执行。 由于这些侦听器是异步的并且响应事件(如属性更改),因此在构建GUI时可能会触发这些侦听器。 结果是,当您在主线程中构建时,某些侦听器正在EDT上执行,并且一些侦听器也可能在其他线程上运行(因为侦听器混淆并在错误的线程上触发)。 结果是一个巨大的不可预测的混乱。“ 也许他们不知道他们在谈论什么……但目前我采取的是“更安全而不是抱歉”的方法。 Potochkin, http: //weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html似乎也认为我们熟悉后来更严格的规则

JFrame以及为什么要继续运行

为什么我创建一个JFrame然后程序仍然运行,直到(即)我用窗口的小“退出按钮”关闭它? 我寻找这个答案但我失败了。 我猜到的唯一的事情就是当我做new JFrame()它就像一个特殊的new ,它在EDT中保留了对象的引用,所以它总是被引用(即使它是一个匿名的“new”)而且它不是将被垃圾收集器删除。 然后,一旦触发了窗口关闭事件,就会取消引用并销毁该对象。

在AWT-EventQueue-0中导致此NullPointerException的原因是什么?

该程序: 一个简单的模拟器,可以学习Java的基础知识。 用户可以在提供的编辑器中输入他自己的代码,该编辑器将玩家移动到一个字段中。 此代码在单独的线程中执行。 除了当前这个问题,该程序工作正常,这个错误突然出现,并没有出现过。 问题: 出于某种原因,在随机时间间隔内,玩家抛出下面所见的exception。 玩家执行的操作无关紧要,因为这也会在执行无限重复单个动作的随机时间后显示出来。 每次执行该字段上的任何操作时都会抛出此错误,这意味着控制台日志会反复填充相同的错误消息。 代码 这是用户代码的执行方式,CompileActionListener调用JavaCompiler: method = CompileActionListener.getNewActor().getClass().getMethod(“main”); method.invoke(CompileActionListener.getNewActor()); 就我而言,其他代码不应该抛出所述执行(堆栈树不会暗示我自己的任何类)。 由于这是一个NPE,它应该很容易追溯,但由于缺乏对我的类和随机时间间隔的引用我无能为力。 堆栈跟踪 Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException at javax.swing.text.GlyphView.getBreakSpot(GlyphView.java:799) at javax.swing.text.GlyphView.getBreakWeight(GlyphView.java:724) at javax.swing.text.FlowView$LogicalView.getPreferredSpan(FlowView.java:733) at javax.swing.text.FlowView.calculateMinorAxisRequirements(FlowView.java:233) at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:717) at javax.swing.text.BoxView.checkRequests(BoxView.java:935) at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:568) at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:903) at javax.swing.text.BoxView.checkRequests(BoxView.java:935) at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:343) at javax.swing.text.BoxView.layout(BoxView.java:708) at javax.swing.text.BoxView.setSize(BoxView.java:397) at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1722) at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:912) at javax.swing.JComponent.getPreferredSize(JComponent.java:1659) at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1332) […]

Swing应用程序初始化和加载屏幕方法

我已经制作了很多不同的Swing应用程序,它们的加载时间通常在几秒到几分钟之间变化,具体取决于应用程序UI /数据大小。 在某些情况下,应用程序数据加载与UI加载混合在一起。 几秒钟的加载时间不是问题,但是当它比10秒钟更长时 – 显然应该显示某种加载屏幕,直到UI /数据完全初始化为止。 你通常会做什么 – 首先创建某种加载屏幕(例如带有徽标的窗口和一些在加载应用程序时正在更新的标签),并从应用程序中的各种加载“点”更新它。 问题是 – 应用程序通常在排队到EDT的单个调用中加载,很难将其分成多个调用EDT,而不会使应用程序的代码复杂化。 因此,由于应用程序加载是在排队到EDT的单个调用中执行的,因此您无法正确更新加载屏幕 – 直到应用程序初始化之后才会显示更新,因为EDT正忙于加载应用程序。 因此,为了在某些情况下实现加载屏幕,我已经在EDT之外移动了应用程序UI初始化,并且设计它们的方式是在执行加载时不会执行任何UI更新。 应用程序的框架显示和所有应用程序UI操作仍将在EDT中执行。 这通常不太好,但经过大量测试并查看Swing代码后,我确信它不会导致任何问题,即使在大型应用程序上也是如此。 尽管如此,即使不引起任何问题,这也不是一件好事。 所以问题是: 在EDT中保持应用程序初始化的同时,可以使用哪些方法正确显示和更新应用程序加载屏幕? 希望它不是太宽泛。 这是一个“虚拟”应用程序,它展示了一种“坏”方法: import javax.swing.*; import java.awt.*; public class DummyApplication extends JFrame { private static JDialog loadingDialog; private static JLabel loadingProgress; public DummyApplication () { super ( “Dummy application” ); dummyProgressUpdate ( “Loading content…”, […]

Java Swing EDT和并发

我只是想知道是否仍然需要确保invokeLater()Runnable的同步性。 我遇到了死锁,需要在保持并发性的同时克服它。 这是一个好代码的例子吗?: private String text; private void updateText() { SwingUtilities.invokeLater(new Runnable() { public void run() { synchronized(FrameImpl.this) { someLabel.setText(text); } } }); } 对于相当糟糕的示例感到抱歉,但我们必须假设text正被不同的线程修改,无法注入,并且依赖于正确的值。 这是正确的解决方案,还是通过将同步代码发送到未知的上下文中而无意中造成死锁问题? 谢谢。

Java API“如果不在EDT上运行在EDT上”

只是对我的一些重复代码的思考: Runnable run = new Runnable() { @Override public void run() { // Some EDT code } }; if (!EventQueue.isDispatchThread()) { SwingUtilities.invokeAndWait(run); } else { run.run(); } 它并不是非常烦人,但似乎有一些专有function会为你检查这个,虽然我还没有找到它。

java SwingWorker.doInBackground()不能访问GUI元素

可能这是微不足道的,我正在努力理解关于SwingWorker的简单文档。 这是复制粘贴的内容 工作流程 SwingWorker的生命周期涉及三个线程: 当前线程:在此线程上调用execute()方法。 它安排SwingWorker在工作线程上执行并立即返回。 可以等待SwingWorker使用get方法完成。 工作线程:在此线程上调用doInBackground()方法。 这是所有背景活动应该发生的地方。 要通知PropertyChangeListeners有关绑定属性的更改,请使用firePropertyChange和getPropertyChangeSupport()方法。 默认情况下,有两个绑定属性:状态和进度。 事件调度线程:此线程上发生所有与Swing相关的活动。 SwingWorker调用process和done()方法并通知此线程上的任何PropertyChangeListeners。 通常,Current线程是Event Dispatch Thread。 – 工作线程不是EDT,因此doInBackground()中的代码不能访问GUI元素。 我的理解是否正确? 背景:我们有使用SwingWorker的小代码,但有doInBackground()创建FileChooser并调用setCurrentDirectory() 。 我怀疑这导致我exception几乎与http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181(11-Closed,not a defect)相同

迭代或循环内部更改JTextField的文本

假设我有一个JTextField“status”,我正在运行这段代码: status = new JTextField(50); add(status); for (int i=0; i<10000; i++) { status.setText("bla bla – "+ i); System.out.println("bla bla – "+ i); } 我的问题是,现在当循环运行时,JTextField的文本中没有任何事情发生,并且只有当循环结束时,标签是“bla bla – 10000”。 我想制作类似于状态栏的内容,但无法更新此状态栏“在线”。 我也尝试在一个线程中进行更新,但以相同的结果结束。 有人能告诉我如何在迭代或循环时在GUI中显示文本吗?

检查线是否需要EDT?

我有一个用Swing实现的UI。 一个组件做了一些可能需要一些时间的工作,所以我使用SwingUtilities.invokeLater 。 但是,我正在阅读一些旧代码并在ActionListener找到它: if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(new Runnable() { public void run() { // code X } }); } else { // code X } 我认为这是有道理的,因为它将code X与EDT分开。 但是,我发现它很容易出错,因为我已经使用了几次,而且两次都忘记了else部分。 问题是:是否需要检查SwingUtilities.isEventDispatchThread() ? 或者我可以假设我不在EDT并且总是使用invokeLater ? 非常感谢。