我有一个Swing JFrame。如果我在程序执行期间在新线程中创建一个新的JFrame,那将是EDT?在最后一个JFrame窗口的当前线程中或在第一个窗口中。
编辑: 谢谢你的回答。
我理解他们,我很好。我知道我们不必在EDT的其他地方创建摆动对象,但我遇到了问题。
我解释说;我开发了一个用于创建和提取存档的JAVA应用程序,如winrar。您可以使用多线程同时创建多个arhive。最近,我希望在每次创建时在JprogressBar形式的JprogressBar中添加信息状态。但我的问题是在新的状态框架和创建存档的线程中生成通信。这就是为什么我在存档线程中创建JFrame以更新当前的进度条。但是,就像我可以在潜水员信息源和你的答案/评论中阅读它,它反对java摇摆和性能;我无法在EDT的其他地方创建摇摆对象。
但是,我应该如何解决我的问题?
答案 0 :(得分:7)
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);
}
});
}
答案 1 :(得分:5)
事件调度线程已修复。它不会因为你在另一个线程上创建一个Swing对象而被重新分配(你永远不应该这样做)。
答案 2 :(得分:1)
这应该很简单,如果所有事件都在当前EDT中完成,那么EDT不存在,另一个Queue可以说明,
invokeLater / invokeAndWait
,输出
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;
}
}