Java 打开和启动swing界面的首选方法是什么,以及';有什么区别?

Java 打开和启动swing界面的首选方法是什么,以及';有什么区别?,java,swing,user-interface,runnable,Java,Swing,User Interface,Runnable,因此,我找到了多种用java实现swing GUI的方法,但不知道每种方法都能做些什么,我的老师也无法帮助我。创建JFrame的一种方法是: import javax.swing.*; import java.awt.*; public class UI extends JFrame{ public UI() { initaliseGUI(); } private void initaliseGUI(){ setTitle("My

因此,我找到了多种用java实现swing GUI的方法,但不知道每种方法都能做些什么,我的老师也无法帮助我。创建JFrame的一种方法是:

import javax.swing.*;
import java.awt.*;

public class UI extends JFrame{

    public UI() {

        initaliseGUI();
    }

    private void initaliseGUI(){
        setTitle("My Title");
        setBackground(Color.red);
        setSize(800,500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);



}
public static void main(String[] args){
    EventQueue.invokeLater(new Runnable(){

        @Override
        public void run(){
            UI M = new UI();
            M.setVisible(true);

        }   
    }); 
}
但另一种实施方式是:

import javax.swing.*;
import java.awt.*;
public class Main{
    public static void main(String[] args){

        JFrame window = new JFrame();
        window.setSize(500,500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = window.getContentPane();
        c.setBackground(Color.red); 
        window.setBackground(Color.red);        
        window.setTitle("main");
        JLabel message = new JLabel("JLabel");
        window.add(message);
        window.setVisible(true);
    }
}
每一个的工作方式和我应该在什么时候使用一个而不是另一个之间有什么区别?在这种情况下,runnable是如何工作的


谢谢

第一个示例调用EventQueue invokeLater方法,但扩展了JFrame

第二个示例将所有内容都放在静态方法main中,而不运行invokeLater方法

这里有一种启动Swing应用程序的方法

public class TryingProject2 implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Color Gradient Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        // Add your Swing components here
        return panel;
    }
}
我不需要扩展Swing组件。我使用Swing组件。扩展Swing组件或任何Java类的唯一时间是要重写其中一个类方法时

SwingUtilities调用器方法与EventQueue调用器方法相同。此方法将所有Swing组件的创建和更新放在屏幕上

我实现Runnable是因为它使invokeLater方法参数成为类的实例


我在一个方法中创建了主面板,以使JFrame代码与JPanel代码分开。

您的第一个示例调用EventQueue invokeLater方法,但扩展了JFrame

第二个示例将所有内容都放在静态方法main中,而不运行invokeLater方法

这里有一种启动Swing应用程序的方法

public class TryingProject2 implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Color Gradient Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        // Add your Swing components here
        return panel;
    }
}
我不需要扩展Swing组件。我使用Swing组件。扩展Swing组件或任何Java类的唯一时间是要重写其中一个类方法时

SwingUtilities调用器方法与EventQueue调用器方法相同。此方法将所有Swing组件的创建和更新放在屏幕上

我实现Runnable是因为它使invokeLater方法参数成为类的实例


我用一种方法创建了主面板,以使JFrame代码与JPanel代码分开。

看起来您需要研究
接口
@jheimbouch之间的区别。除了
调用器()
之外,还有更多的区别。我认为更根本的区别在于扩展
JFrame
和在
main()
中创建
JFrame
(或在
main()
中初始化的线程)之间。我个人更喜欢扩展
JFrame
并在构造函数中创建UI元素,而不是在
main()中设置所有内容
直接。@Jack通常不希望扩展JFrame,而是像JPanel这样的容器。我们很少需要定制的JFrame,当然还有很多其他原因不需要这样做。看看这里:根据一般经验,您应该避免从顶级容器(如JFrame)进行扩展,原因有很多,您实际上并没有向类添加任何新特性,而是将自己锁定在单个用例中,从而降低了类和其他一些类的可重用性。取而代之的是用一个JPanel启动,然后简单地将它添加到您想要的容器中。作为一般概念,您应该查找组合而不是继承。看起来您需要研究
接口
@jheimbouch之间的区别不仅仅是
调用器()
。我认为更根本的区别在于扩展
JFrame
和在
main()
中创建
JFrame
(或在
main()
中初始化的线程)之间。我个人更喜欢扩展
JFrame
并在构造函数中创建UI元素,而不是在
main()中设置所有内容
直接。@Jack通常不希望扩展JFrame,而是像JPanel这样的容器。我们很少需要定制的JFrame,当然还有很多其他原因不需要这样做。看看这里:根据一般经验,您应该避免从顶级容器(如JFrame)进行扩展,原因有很多,您实际上并没有向类添加任何新特性,而是将自己锁定在单个用例中,从而降低了类和其他一些类的可重用性。取而代之的是用一个JPanel启动,然后简单地将它添加到您想要的容器中。一般来说,您应该查找组合而不是继承