使用Event Queue在main()中执行一个简单的方法

时间:2012-04-30 20:05:10

标签: java swing event-dispatch-thread invokelater

我正在开发一个由某个人开发的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 是否有任何意义?

3 个答案:

答案 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();
        }
    });
}