Tag: event dispatch thread

Java Swing:GUI冻结 – jstack解释

我有一个Gui应用程序,可以在串行热敏打印机上打印票据。 当我点击启动此操作的按钮时,我的GUI被冻结。 我认为那是因为代码是在EDT上执行的。 我使用jstack确定但我不理解下面的结果: Full thread dump Java HotSpot(TM) Client VM (23.3-b01 mixed mode, sharing): “Thread-12” prio=6 tid=0x03012000 nid=0xd04 runnable [0x038ef000] java.lang.Thread.State: RUNNABLE at gnu.io.RXTXPort.eventLoop(Native Method) at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575) “Thread-6” prio=6 tid=0x0302c400 nid=0x1b0 waiting on condition [0x039ef000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at posO2.Threads.ThreadHorloge.run(ThreadHorloge.java:46) “Thread-5” prio=6 tid=0x03511c00 nid=0x9e4 waiting on condition [0x0399f000] java.lang.Thread.State: TIMED_WAITING (sleeping) […]

为什么我的JTextArea没有更新?

我的代码如下: class SimplifiedClass extends JApplet { private JTextArea outputText; // Lots of methods public void DoEverything() { String output = “”; for(int i = 0; i <= 10; i++) { output += TaskObject.someLongTask(i); outputText.setText(output); } } } 但是,当调用setText时,不是在循环的每次迭代之后更新文本区域,而是在完成任务的所有运行时它似乎仅更新文本。 为什么会发生这种情况,我该如何解决?

使线程在EDT的非EDT(事件调度线程)线程上运行

我有一个在EDT上运行的方法,并且我想让它在新的(非EDT)线程上执行某些操作。 我目前的代码如下: @Override public void actionPerformed(ActionEvent arg0) { //gathering parameters from GUI //below code I want to run in new Thread and then kill this thread/(close the JFrame) new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState); }

Java EventQueue。 为什么一切都应该在invokelater方法中?

在我正在阅读的书中,带有multithreading的GUI的每个例子都有类似的东西: public static void main(String[] args) throws Exception { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new SomeKindOfFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } (我的意思是EventQueue)。 但是不是主(EDT)线程中自动执行的代码?

在运行时SwingvalidationEvent Dispatch Thread上的代码

是否有任何库可以检测代码以validation在事件调度线程上调用Swing组件上调用的方法? 编写一些用于执行此操作的基本代码可能不会太困难,但我确信有其他人处理的边缘情况。 我在运行时寻找这个,而不是unit testing。

在Swing应用程序内部的javax.swing.Timer与java.util.Timer

最好在swing应用程序中使用javax.swing.Timer而不是使用java.util.Timer ? 例如: Timer timer = new Timer(1000, e -> label.setText(new Date().toString())); timer.setCoalesce(true); timer.setRepeats(true); timer.setInitialDelay(0); timer.start(); 要么 new java.util.Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { label.setText(new Date().toString()); } }, 0, 1000); 这两个有什么区别吗?

Java Swing – 在EDT上运行

关于Swing和使用EDT进行GUI更新,我有几个问题。 我刚刚开始阅读这些内容,所以我是这个领域的初学者: 在EDT上运行需要哪些操作? 如果他们不这样做,只是提出exception? 我们实际上在EDT上是否有任何特定的时间? 如果我们使用SingUtilities.invokeLater计划任务,我们将它排入GUI更新任务的当前队列吗? 访问上面的队列我猜是同步的,或者使用了一些并发集合,但如果我从两个后台线程安排两个GUI更新任务,就不可能说先添加哪一个? 例如,如果线程1 FIRST提交了将JLable的文本设置为“是”的任务,然后,短时间后,第二个线程出现并提交将该值设置为“no”的任务,我们是否保证结果将是“是”,或者仅仅是操作系统如何安排这些事情的问题? SwingWorker究竟如何确保在EDT上运行done()方法? 它设置以下代码: future = new FutureTask(callable) { @Override protected void done() { doneEDT(); setState(StateValue.DONE); } }; 所以我想知道FutureTask是否确保调用invokeLater ? 谢谢你的所有答案。

SwingUtilities invokeLater的主要目的

我有这段代码 import javax.swing.SwingUtilities; public class Client1 { public static void main( String[] args ) { SwingUtilities.invokeLater( new Runnable() { public void run() { //new MyWindow( “Bayog” ); new MyWindowV2( “Bayog” ); } } ); } } 如果我不使用SwingUtilities有什么区别?

如何使用带有延迟的while循环每次更新jLabel

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int count = jSlider1.getValue(); int delay = jSlider2.getValue(); int valueOfSlider = jSlider2.getValue(); int valueOfSlider2 = jSlider1.getValue(); while (count > 0) { count–; String count2 = “”+count; jLabel3.setText(count2); try {Thread.sleep(delay); } catch (InterruptedException ie) { } } 它最终将显示jLabel上的最终数字,但它不会逐步更新数字。 任何帮助

你如何使用Event Dispatch Thread?

我了解了swing如何不是线程安全的。 深入研究,我发现对swing组件的每次修改都必须在Event Dispatch Thread上完成,以防止与multithreading相关的各种问题。 然而,信息似乎完全停在那里。 似乎没有一个很好的教程可以解释如何在互联网上随处访问。 将与其他问题相关的代码中的信息拼凑在一起,似乎我必须在我的程序中的每一个swing修改中放置一个不整齐的代码块(就像我自己的代码中的这个例子): try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { setTitle(“Frame title”); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setSize(800, 480); setLocationRelativeTo(null); setIconImage(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource(“Frame icon.png”))); } }); } catch (Exception e) { e.printStackTrace(); } 基本上,这是对的吗? 我是否必须在代码中对Swing组件的每次修改周围放置该代码(或与invokeLater等效的代码)? 另外,为什么Swing不会自动执行此操作?