有些疑问与在Java Swing程序中使用SwingUtilities.invokeLater()方法有关

时间:2013-09-25 14:09:42

标签: java swing code-design swingutilities invokelater

我正在学习Java Swing,我对这个简单的代码教程有些疑问:

package com.andrea.execute;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/* An istance of a SimpleExample class is a JFrame object: a top level container */
public class SimpleExample extends JFrame {

    /* Create a new SimpleExample object (that is a JFrame object) and set some property */
    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                // Center the window on the screen. 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });
    }
}

逻辑很简单:我有一个继承自 JFrame Swing类的 SimpleExample 类。因此 SimpleExample 将是一个顶级容器。

这个类还包含 main()方法,现在我有两个疑问:

1)为什么在main()方法中执行此代码:

SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });

它在SwingUtilities类上调用 invokeLater()方法,并向其传递一个新的Runnable对象。

阅读我知道的文档,这是将应用程序放在Swing Event Queue上的一种方法。它用于确保所有UI更新都是并发安全的。

我有一些问题要理解它是如何实现的。

invokeLater()方法的输入参数内,它传递了这个“东西”:

new Runnable() {
        @Override
        public void run() {
            SimpleExample ex = new SimpleExample();
            ex.setVisible(true);
        }
    });

这是什么东西?什么代表?以及它是如何工作的?

TNX

安德烈

3 个答案:

答案 0 :(得分:4)

anonymous class实施Runnable interface

您可以在没有匿名类的情况下使用它,例如:

class SimpleExample extends JFrame {

    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new App());
    }
}

class App implements Runnable {

    public void run() {
        SimpleExample ex = new SimpleExample();
        ex.setVisible(true);
    }
}

但是匿名课更方便。

答案 1 :(得分:1)

Runnable是一个包含run方法的接口。 invokeLater需要runnable的这个实现来从swing线程调用传递的run方法。

请参阅此链接以获取更多信息 http://en.wikibooks.org/wiki/Java_Programming/Threads_and_Runnables

答案 2 :(得分:1)

javax.swing.SwingUtilities#invokeLater(Runnable doRun),安排java.lang.Runnable执行 在事件线程上(可从任何线程调用);