Java/Swing GUI 最佳实践(从代码的角度来看)[已关闭]

与此 wiki 形成鲜明对比的是,我正在寻找从编码角度实现 Swing GUI 控件的正确方法。

我一直在寻求学习Java及其GUI工具,但我发现一个又一个的互联网教程抛出了一切,我知道这是不对的。main

我也尝试过RAD系统,如Netbeans和其他“可视化”编辑器,但是当我开始编码时,我已经有了一堆代码,我不知道它的作用,所以我打算学习手动移动代码,我知道基本的控件和布局,但希望以正确的方式做到这一点。

是否有我缺少的型号或标准?

示例问题...

我是否扩展 JFrame 并创建自己的帧对象?(我假设是的)

我是否将主菜单封装在该框架对象内?还是我自己创建?等。。。

如何将“视图”逻辑与“应用程序”逻辑分开?

基本上,我正在寻找行业标准是什么,关于如何组织GUI代码。


答案 1

由于似乎有一些关于什么构成“最佳实践”的争论,我会给你我发现最适合我的东西,以及我的推理:

1. 每个窗口应扩展 JFrame 或 JDialog(取决于窗口的类型)。这样可以轻松控制窗口的属性,而无需每次都指定特定对象。不过,这更像是一般情况,因为众所周知,我以两种方式都这样做。

2. 该方法应位于单独的类中。这增加了能够在其他地方使用窗口类的可能性,因为它们不依赖于特定的实现。从技术上讲,这并没有区别,但应用程序启动代码并不属于窗口。main()

3. 监听器应该在匿名的内部类中。顶级类不应实现任何侦听器。这可以防止黑客攻击,例如从除侦听器方法附加到的对象之外的任何地方调用侦听器方法。

下面是一个具有单个框架的简单应用程序,用于演示这些做法:

public class Main {
    public static void main(String[] args) {
        final String text = args[0];
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final MyWindow wnd = new MyWindow(text);
                wnd.setVisible(true);
            }
        });
    }
}

public class MyWindow extends JFrame {
    public MyWindow(String text) {
        super("My Window");

        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                MyWindow.this.setVisible(false);
                MyWindow.this.dispose();
            }
        });

        final JButton btn = new JButton(text);
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(MyWindow.this, "Button Pressed", "Hey", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        setLayout(new FlowLayout());
        add(btn);
        pack();
    }
}

答案 2

我同意乔纳森的所有观点

  1. 每个窗口都应该扩展 JFrame 或 JDialog...

  2. main() 方法应该在一个单独的类中...

  3. 侦听器应该在匿名的内部类中...

我还想补充以下几点:

  1. 明智地使用 GridBagLayout (GBL)。GBL是一个功能强大的布局管理器,很难学习,但功能非常强大。

  2. 考虑手动编码所有 UI。我个人不喜欢可视化编辑器生成的代码。但是,话虽如此,我已经好几年没有使用可视化编辑器了(2000ish)。在这一点上,它们可能会更好。

  3. 明智地使用JPanels。查看你的 ui 并确定哪些组件的行为应与屏幕大小更改相同,然后在 JPanel 上将这些组件组合在一起。考虑在 JPanels 中使用 JPanels 来获得正确的大小调整行为。

我通常采取稍微不同的方法让我的组件处理事件,而不是Jonathan,但我相信他的方法比我的方法更干净。

另外,真正研究MVC和分层架构的使用。最好不要将 UI 和业务逻辑混合在一起。