【问题标题】:Java/Swing GUI best practices (from a code standpoint) [closed]Java/Swing GUI 最佳实践(从代码的角度来看)[关闭]
【发布时间】:2011-03-29 14:05:19
【问题描述】:

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

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

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

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

示例问题...

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

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

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

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

【问题讨论】:

  • 这属于 Programmers SE... 我在哪里 asked it already
  • 我不得不说我不同意,因为我要求编码特定示例。有机会获得定量的非主观答案。程序员是针对更主观的、与职业相关的问题。不过,我非常感谢您提供的信息,并将查看您问题的答案。
  • 嗯,你应该明确地说出来,然后......你的意思是你想要你在“示例问题”下列出的三件事的答案吗?
  • 当然,作为开始,我会进行编辑以使自己更清楚。
  • 您在寻求主观帮助。没有“组织代码的行业标准”,因为这就像要求“积分的一个真正推导”......给定“积分 x^2”我希望你推导出它,我希望你知道 我的常数是[省略] 但我不会告诉你我的常数是什么。 〜(我的观点)编程就是这样。有很多方法可以达到相同的最终结果。因此,我的商店的“最佳实践”可能不是您商店的“最佳实践”。至于“互联网教程将所有内容都放在main”,这是因为它们会以最快的速度进入代码。

标签: java user-interface swing standards coding-style


【解决方案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】:

    我同意all of Jonathan's points

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

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

    3. 侦听器应位于匿名内部类中...

    我还想补充以下内容:

    1. 明智地使用 GridBagLayout (GBL)。 GBL 是一个强大的布局管理器,虽然难学,但功能相当强大。

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

    3. 谨慎使用 JPanel。查看您的 ui 并确定哪些组件的行为应与屏幕尺寸更改相同,然后将这些组件组合在 JPanel 上。考虑在 JPanel 中使用 JPanel 来获得正确的大小调整行为。

    在让我的组件处理事件方面,我通常采取与 Jonathan 稍有不同的方法,但我相信他的方法比我的更简洁。

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

    【讨论】:

    • "5.) 考虑手动编写所有 UI。我个人不喜欢可视化编辑器生成的代码。但是,话虽如此,我已经有好几次没有使用可视化编辑器了年。他们在这一点上可能会更好。让自己休息一下!看看 Netbeans 6.9.1 和 Matisse。你很快就完成了,你得到的代码非常好。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2010-10-25
    • 2011-10-20
    • 2015-12-22
    • 2014-05-15
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多