0

我正在学习 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);
            }
        });

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

阅读文档我知道这是将应用程序放在 Swing 事件队列中的一种方式。它用于确保所有 UI 更新都是并发安全的。

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

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

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

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

肿瘤坏死因子

安德烈亚

4

3 回答 3

4

它是一个实现Runnable 接口的匿名类

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

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);
    }
}

但是匿名类更方便。

于 2013-09-25T14:19:31.557 回答
1

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

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

于 2013-09-25T14:17:39.377 回答
1

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

于 2013-09-25T14:23:04.117 回答