首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java/Swing GUI最佳实践(从代码的角度)

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

Stack Overflow用户
提问于 2011-03-29 22:05:19
回答 2查看 32.6K关注 0票数 23

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

我一直在寻求学习Java和它的图形用户界面工具,但是我发现互联网教程一个接一个地使用main,我知道这是不正确的。

我也尝试过像Netbeans和其他“可视化”编辑器这样的RAD系统,但是当我开始编码的时候,我已经有了一堆代码,我不知道它做了什么,所以我打算学习手工编写swing代码,我知道基本的控件和布局,但希望以正确的方式完成它。

有没有我遗漏的模型或标准?

示例问题...

我要扩展JFrame并创建我自己的frame对象吗?(我假设是)

我是否要将主菜单封装在该frame对象中?或者我自己创建?等等。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 22:52:50

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

  1. 每个窗口都应该扩展JFrame或JDialog (取决于窗口类型)。这使得控制窗口的属性变得很容易,而不需要每次都指定特定的对象。不过,这是更一般的情况,因为我知道这两种方法都可以做到。--

  1. main()方法应该在单独的类中。这增加了在其他地方使用窗口类的可能性,因为它们不绑定到特定的实现。从技术上讲,这没有什么不同,但应用程序启动代码不属于窗口。

  1. 侦听器应该在匿名内部类中。您的顶级类不应实现任何侦听器。这可以防止诸如从任何地方调用侦听器方法之类的黑客攻击,而不是从它们所附加到的对象。

下面是一个简单的应用程序,其中包含一个框架来演示这些实践:

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();
    }
}
票数 38
EN

Stack Overflow用户

发布于 2011-03-29 23:59:35

我同意all of Jonathan's points的观点。

  1. 每个窗口都应该扩展JFrame或JDialog...
  2. main()方法应该在单独的class...
  3. Listeners中应该在匿名内部类中...

我还想补充以下几点:

  1. 明智地使用了GridBagLayout (GBL)。是一个强大的布局管理器,很难学习,但相当powerful.
  2. Consider手工编写所有的用户界面。我个人并不喜欢由可视化编辑器生成的代码。但是,尽管如此,我已经有几年没有使用可视化编辑器了(2000年左右)。在这一点上,它们可能更好。
  3. 明智地使用了JPanels。查看您的ui,确定哪些组件应在屏幕大小更改时具有相同的行为,然后在JPanel上将这些组件组合在一起。考虑在JPanels中使用JPanels来获得正确的大小调整行为。

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

另外,还要学习MVC和分层架构的使用。最好不要把UI和业务逻辑混在一起。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5473828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档