Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建Swing Java应用程序的正确方法_Java_Swing_User Interface_Constructor - Fatal编程技术网

创建Swing Java应用程序的正确方法

创建Swing Java应用程序的正确方法,java,swing,user-interface,constructor,Java,Swing,User Interface,Constructor,我以前在学校有一些swing应用程序的经验,所以我知道它们是如何工作的,并且会很好地设计它们,但我不确定设置应用程序的最佳方式 我们在学校只创建了较小的程序,所以我们几乎所有的代码都在构造函数中,但我想创建更大的程序,我不确定应该如何设置 我有一个带有构造函数的基类,它将创建我的JFrame,我将在整个应用程序中使用它,但是我要创建哪些类来添加我的组件,或者使用动作侦听器呢?我不确定如何正确地做到这一点,所以一个指导性的步骤将是伟大的 这是我的类声明/构造函数: public class Swi

我以前在学校有一些swing应用程序的经验,所以我知道它们是如何工作的,并且会很好地设计它们,但我不确定设置应用程序的最佳方式

我们在学校只创建了较小的程序,所以我们几乎所有的代码都在构造函数中,但我想创建更大的程序,我不确定应该如何设置

我有一个带有构造函数的基类,它将创建我的JFrame,我将在整个应用程序中使用它,但是我要创建哪些类来添加我的组件,或者使用动作侦听器呢?我不确定如何正确地做到这一点,所以一个指导性的步骤将是伟大的

这是我的类声明/构造函数:

public class SwingApp1 extends JFrame{

    public SwingApp1() {
        setTitle("Greens Tracker");
        setSize(800,500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

}
现在,我应该在我的main中添加什么,我应该在哪个manor中添加组件


感谢您的帮助,谢谢

设置JFrame的好方法是

public GUI() {
    buildGUI();
}

private void buildGUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setSize(500, 300);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new GUI().setVisible(true);
        }
    });

}

我希望它能有所帮助:)

该计划从以下主要方面开始:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new SwingApp1().setVisible(true);
        }
    });
}
自Java 8以来,可缩写为:

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> new SwingApp1().setVisible(true));
}
JFrame构造函数可以如下所示。我留下一个电话, 而
pack()
将布局内容

public SwingApp1() {
    setTitle("Greens Tracker");
    setSize(800,500);
    ... add components, maybe in a separate method.
    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}
实际上看看MVC,模型-视图-控制器

我通常使用一个XyzApplication类作为控制器,JFrame是主视图,单独保存的数据(在应用程序中)是模型

应该提到的是,JavaFX可能稍微更可取一些,比如说没有FXML布局文件。需要更多的学习,但要有更好的行为

其他建议是使用像maven这样的构建基础设施。这有助于处理库(“依赖项”),并提供“最佳实践”,如构建目录(src/main/java、src/test/java、src/main/resources…)


当然,像git或mercurial这样的版本控制系统。

这是一个广泛的问题(有些人认为是什么)。作为一般建议,您应该避免直接从顶级容器进行扩展,例如
JFrame
,它们将您的代码耦合到单个用例中,并减少重复使用的可能性。此外,您并没有真正向类添加任何新功能,此外,您的构造函数还有一个副作用(使窗口可见)@MadProgrammer说了什么,我还要补充一点,当存在其他更好支持的GUI库(即JavaFX)时,您确定要使用一个半弃用的库来创建GUI吗?特别是如果现在图书馆的选择不是由学术要求决定的话。作为一般性建议,我总是喜欢从
JPanel
开始,它很容易定制,可以添加到我需要的任何容器中(
JFrame
JDialog
,其他一些容器),并以此为基础构建我的UI。您还应该确保在事件调度线程的上下文中启动UI,以避免可能出现的故障和错误issues@HovercraftFullOfEels我只是对Swing有点熟悉,所以我想从那里开始可能会更容易。这个JavaFX,它有很多不同/更好吗?我不能说得更好,因为我不太了解它(@MadProgrammer可以回答这个问题),但它的主要优点是它得到了支持。无论您选择哪一种,都要努力将您的逻辑从视图中分离出来,并使用la MVC(model view controller),这样,如果您以后想要更改GUI库,就可以更轻松地进行更改。