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

jon*_*ohn 21 java standards user-interface swing coding-style

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

我一直在寻求学习Java及其GUI工具,但我发现互联网教程后的互联网教程会把所有东西都扔进去main,我知道这是不对的.

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

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

示例问题......

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

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

如何将"View"逻辑与"Application"逻辑分开?

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

Jon*_*han 36

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您是否应该使用SwingUtilities在事件分发线程中而不是在主线程中构建窗口? (2认同)
  • 是的,你是对的。两年后,我更新了答案。 (2认同)
  • 很棒的答案!我想写这句话是因为赞成票并没有减少它。+1! (2认同)

hoo*_*knc 12

我同意乔纳森的所有观点.

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

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

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

我还想补充以下内容:

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

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

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

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

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