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

时间:2011-03-29 14:05:19

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

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

我一直在努力学习Java及其GUI工具,但是我发现网络教程之后的互联网教程将所有内容都抛到了main,我知道这是不对的。

我也尝试过像Netbeans和其他“视觉”编辑器这样的RAD系统,但是当我编写代码时,我有一堆代码,我不知道它的一半,所以我是意图学习手动代码摆动,我知道基本的控件和布局,但想以正确的方式去做。

我缺少一个模型或标准吗?

示例问题......

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

我将主菜单封装在该框架对象中吗?还是我自己创造?等...

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

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

2 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:11)

我同意all of Jonathan's points

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

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

  4.   
  5. 听众应该是匿名的内部班级......

  6.   

我还想补充以下内容:

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

5.)考虑手动编码所有UI。我个人不是视觉编辑生成的代码的粉丝。但是,据说我在几年内没有使用过可视化编辑器。在这一点上他们可能会更好。

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

我通常采用略微不同的方法让我的组件处理Jonathan所做的事件,但我相信他的方法比我的方法更清洁。

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