我正在开发一个由某个人开发的Java应用程序,作为研究项目的一部分。以下是主要方法:
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
// Change the name of the application on a mac
System.setProperty("com.apple.mrj.application.apple.menu.about.name",
"XX");
// Use the top of the screen for the menu on a mac
if( System.getProperty( "mrj.version" ) != null ) {
System.setProperty( "apple.laf.useScreenMenuBar", "true" );
}
try {
// Use system look and feel
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
System.out.println("Cannot use system's look and feel; using Java's default instead");
}
// Create a new instance of XX
XX.getInstance();
}
});
}
现在,我不明白为什么使用事件队列而不是仅使用
public static void main(String[] args) {
//the MAC stuff!!
XX.getInstance(); //this line creates the UI and the event handlers
}
使用 EventQueue 是否有任何意义?
答案 0 :(得分:2)
EventQueue.invokeLater()
将在GUI线程(调度线程)上运行该Runnable。您需要从分派线程运行GUI的更新。从你的代码来看,我不认为你真的需要它,你只需要在后台线程中运行时使用它(例如在事件的回调中)。
答案 1 :(得分:2)
Swing(并且,如果我们是诚实的,AWT)是线程敌对的。与绝大多数GUI库一样,它不是线程安全的,并且没有意义 - 微同步是不现实的。更糟糕的是,它使用有效的可变静态(实际上使用奇怪的AppContext
想法)来运行AWT事件调度线程(EDT)。即使在“实现”之前设置GUI,也会发生这种情况。
可能它不会成为问题。也许在某些情况下,也许在JRE更新之后,它会给出一些问题。也许它只是一个不合适的插入符号。问题是,你是否想要考虑冒这个风险,或者只是打击标准的Java风格的详细样板?
答案 2 :(得分:2)
应在Initial Thread上设置属性,然后应在事件派发线程上安排GUI进行构建。显示了替代方法here。
public static void main(String[] args) {
// Change the name of the application on a mac
System.setProperty(
"com.apple.mrj.application.apple.menu.about.name", "XX");
// Use the top of the screen for the menu on a mac
if (System.getProperty("mrj.version") != null) {
System.setProperty("apple.laf.useScreenMenuBar", "true");
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// Create a new instance of XX
XX.getInstance();
}
});
}