EDT位置有几个JFrame窗口

我有一个Swing JFrame。 如果我在程序执行期间在新线程中创建一个新的JFrame,那么EDT会是什么? 在最后一个JFrame窗口的当前线程中或在第一个窗口中。

编辑:谢谢你的回答。

我理解他们,我很好。 我知道我们不必在EDT的其他地方创建摆动对象,但我遇到了问题。

我解释; 我开发了一个JAVA应用程序,用于创建和提取存档,如winrar。 您可以使用multithreading同时创建多个arhive。 最近,我希望在每次创建时在新的JFrame中以JprogressBar的forms在存档创建期间添加信息状态。 但我的问题是在新的状态框架和创建存档的线程中生成通信。 这就是为什么我在存档线程中创建JFrame以更新当前的进度条。

但就像我可以在潜水员信息源和你的答案/评论中阅读它,它反对java摇摆和性能; 我不能在EDT的其他地方创建摆动对象。

但那么,我应该如何解决我的问题呢?

EDT – 事件调度线程 – 与任何具体的GUI组件(例如JFrame)分开。

通常,您应该在EDT上创建所有GUI组件,但这并不意味着它们拥有EDT,EDT也不拥有组件。

要在EDT上创建两个JFrame,您可以执行以下操作:

 public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame1 = new JFrame("Frame 1"); frame1.getContentPane().add(new JLabel("Hello in frame 1")); frame1.pack(); frame1.setLocation(100, 100); frame1.setVisible(true); } }); SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame2 = new JFrame("Frame 2"); frame2.getContentPane().add(new JLabel("Hello in frame 2")); frame2.pack(); frame2.setLocation(200, 200); frame2.setVisible(true); } }); } 

Event Dispatch Thread是固定的。 它不会因为你在另一个线程上创建一个Swing对象而被重新分配(你永远不应该这样做)。

这应该很简单,如果所有事件都在当前EDT中完成,那么EDT不存在,另一个队列可以说明,

  • 来自Swing的听众,
  • 通过将包含在invokeLater / invokeAndWait代码invokeLater / invokeAndWait
  • 但最安全的(对我来说最好的)是javax.swing.Action

产量

 run: Time at : 19:35:21 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 19:35:21 Calling from EventQueue.isDispatchThread Calling from SwingUtilities.isEventDispatchThread Time at : 19:35:21 Calling from EventQueue.isDispatchThread Calling from SwingUtilities.isEventDispatchThread Time at : 19:35:51 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 19:36:21 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 19:36:51 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that Time at : 19:37:21 There isn't Live EventQueue.isDispatchThread, why any reason for that There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that BUILD SUCCESSFUL (total time: 2 minutes 17 seconds) 

来自代码:

 import java.awt.EventQueue; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.*; import javax.swing.*; public class IsThereEDT { private ScheduledExecutorService scheduler; private AccurateScheduledRunnable periodic; private ScheduledFuture periodicMonitor; private int taskPeriod = 30; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); private Date dateRun; public IsThereEDT() { scheduler = Executors.newSingleThreadScheduledExecutor(); periodic = new AccurateScheduledRunnable() { private final int ALLOWED_TARDINESS = 200; private int countRun = 0; private int countCalled = 0; @Override public void run() { countCalled++; if (this.getExecutionTime() < ALLOWED_TARDINESS) { countRun++; isThereReallyEDT(); // non on EDT } } }; periodicMonitor = scheduler.scheduleAtFixedRate(periodic, 0, taskPeriod, TimeUnit.SECONDS); periodic.setThreadMonitor(periodicMonitor); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { isThereReallyEDT(); JFrame frame1 = new JFrame("Frame 1"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.getContentPane().add(new JLabel("Hello in frame 1")); frame1.pack(); frame1.setLocation(100, 100); frame1.setVisible(true); } }); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame2 = new JFrame("Frame 2"); frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame2.getContentPane().add(new JLabel("Hello in frame 2")); frame2.pack(); frame2.setLocation(200, 200); frame2.setVisible(true); isThereReallyEDT(); } }); } private void isThereReallyEDT() { dateRun = new java.util.Date(); System.out.println(" Time at : " + sdf.format(dateRun)); if (EventQueue.isDispatchThread()) { System.out.println("Calling from EventQueue.isDispatchThread"); } else { System.out.println("There isn't Live EventQueue.isDispatchThread, why any reason for that "); } if (SwingUtilities.isEventDispatchThread()) { System.out.println("Calling from SwingUtilities.isEventDispatchThread"); } else { System.out.println("There isn't Live SwingUtilities.isEventDispatchThread, why any reason for that "); } System.out.println(); } public static void main(String[] args) { IsThereEDT isdt = new IsThereEDT(); } } abstract class AccurateScheduledRunnable implements Runnable { private ScheduledFuture thisThreadsMonitor; public void setThreadMonitor(ScheduledFuture monitor) { this.thisThreadsMonitor = monitor; } protected long getExecutionTime() { long delay = -1 * thisThreadsMonitor.getDelay(TimeUnit.MILLISECONDS); return delay; } }