【问题标题】:Implementing Runnable when using Java Swing使用 Java Swing 时实现 Runnable
【发布时间】:2019-01-18 03:17:19
【问题描述】:

现在正在学习一点 Swing,偶然发现了两个教程,它们使用不同的方式制作了一个简单的 JFrame 窗口。

第一个实现 Runnable 并且在类中有一个 JFrame 对象变量:

class SwingDemo implements Runnable {
    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame("title");

        ... // setSize(), add components, etc

    }
}

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

第二个教程没有实现Runnable,而是使用类构造函数来初始化JFrame,并通过匿名内部类调用构造函数

class SwingDemoAlt {

    public SwingDemoAlt() {
        JFrame frame = new JFrame("title");

        ... // again some code here

    }
}

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SwingDemoAlt();
            }
        }
    }
}

这两种方式有何不同?一种方式更可取吗?

【问题讨论】:

    标签: java swing runnable event-dispatch-thread


    【解决方案1】:

    这两种方式有何不同?

    他们没有,不是真的,他们基本上以不同的方式实现相同的目标。

    第一个是更“传统”的方法,而第二个是更“现代”或简写的方法,它利用了欢迎将Anonymous Classes 引入语言的优势。

    还有更好的选择吗?

    这是一个见仁见智的问题,为了我的钱,第二个是首选,因为它不会在类上放置其他不必要的 Runnable 一致性,它还委派了在调用者并阻止代码做出假设(即,您可以随时简单地构建框架并运行它......只需在事件调度线程的上下文中执行它)。

    此外,作为首选项,您不应该直接从JFrame 扩展,因为您实际上并没有向类添加新功能,而是像第二个示例中所做的那样,只需在需要时创建一个实例它并在它之上构建你的用户界面

    您可能还想查看Concurrency in Swing,了解有关为什么应该使用EventQueue.invokeLater 来启动您的用户界面的更多详细信息

    【讨论】:

    • 谢谢你的回答,只是想知道你直接从JFrame扩展是什么意思?
    • @shengbojia 嗯?,我以为我在上面的例子中看到了... extends JFrame,一定是弄错了,所以,不要那样做?
    猜你喜欢
    • 2016-08-04
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多