Java/Swing GUI 最佳实践(从代码的角度来看)

标签 java user-interface swing standards coding-style

作为对比 this wiki ,我正在寻找从编码角度实现 Swing GUI 控件的正确方法。

我一直在努力学习 Java 及其 GUI 工具,但我发现一个又一个的互联网教程将所有内容都放在 main 中,我知道这是不对的。

我也尝试过像 Netbeans 和其他“可视”编辑器这样的 RAD 系统,但是当我开始编码时,我已经有一大堆代码,我不知道它的作用有一半,所以我打算学习手代码 Swing ,我知道基本的控件和布局,但想以正确的方式去做。

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

示例问题...

我是否扩展 JFrame 并创建自己的框架对象? (我认为是的)

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

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

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

最佳答案

由于关于什么是“最佳实践”似乎存在一些争论,我将向您提供我发现的最适合我的方法,以及我的推理:

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

关于Java/Swing GUI 最佳实践(从代码的角度来看),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5473828/

相关文章:

java - .getPixel() 的更好替代方案?

java - 在 CSS 中定位 JSF 2.0 组件

ios - 为什么我不能使用 NSMutableArray 添加 UILabel?

java - 渲染器和编辑器的 JTable 相同组件

java - 框架 JButton、ContentPane

java - RxJava - 合并两个 Observable

c++ - 如何获得由 QDialogBu​​ttonBox 创建的 QPushButton 的角色?

android - 在android中制作具有不同颜色的背景矩形

设置 Nimbus LookandFeel 后,Java Swing JOptionPane Yes 和 No Button 的字体大小不同

java - 在 Canvas 和多行中绘制文本