【问题标题】:Java GUI Design: Use object or use method?Java GUI 设计:使用对象还是使用方法?
【发布时间】:2014-05-01 06:52:28
【问题描述】:

我有一个关于 Java 图形用户界面设计的菜鸟问题:我们应该使用更多方法还是更多对象?举一个非常简单的例子:对话框。

对于对话框,我可以使用方法或使用对象:

使用方法:

public static void MakeDialog() {
    final JFrame frame = new JFrame();
    String help = "";//Reader.readhelp();

    JTextArea contentArea = new JTextArea(help, 60, 60);
    JScrollPane scroller = new JScrollPane(contentArea);
    scroller.setPreferredSize(new Dimension (650,650));

    JButton close = new JButton("Close");
    close.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            frame.dispose();
        }
    });

    JPanel panel = new JPanel();
    panel.add(scroller);
    panel.add(close);

    frame.add(panel);
    frame.setTitle("Help");
    frame.setSize(700, 700);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

然后我只需要调用这个方法需要这个对话框出现。

但是,我可以有另一种方法:创建一个对话框类:

public class MyDialog {

     public MyDialog() {
           final JFrame frame = new JFrame();
    String help = "";//Reader.readhelp();

    JTextArea contentArea = new JTextArea(help, 60, 60);
    JScrollPane scroller = new JScrollPane(contentArea);
    scroller.setPreferredSize(new Dimension (650,650));

    JButton close = new JButton("Close");
    close.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            frame.dispose();
        }
    });

    JPanel panel = new JPanel();
    panel.add(scroller);
    panel.add(close);

    frame.add(panel);
    frame.setTitle("Help");
    frame.setSize(700, 700);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     }
}

真正困扰我的问题是:哪个更有效地使用内存?对于软件中的一两个对话框,这可能根本不是问题。如果我需要处理数百个对话,我需要考虑我可能消耗的内存资源。根据我目前了解到的情况,调用该方法比创建 MyDialog 对象要好,因为一旦处理该方法,就会释放内存。但是,如果我不对其采取任何操作,对象 MyObject 将保留在内存中。我面临的问题是:经过几个小时的开发,我发现我只剩下几MB的内存,我必须退出Eclipse并重新启动我的电脑才能释放内存。

因此:

1) 哪个更好?

2) 如果创建对象更好,如果我不再使用它,如何从内存中删除该对象?

【问题讨论】:

  • 因为JOptionPane 已经是一个现有的类并且您没有向它添加任何功能,所以第一个(方法)接近会,恕我直言,这是一种更好的方法,因为您所做的一切要么类正在配置JOptionPane

标签: java object user-interface memory methods


【解决方案1】:

这里的内存使用无关紧要。差异大约是 20 个字节,这将被垃圾收集。

重要的是正确的设计。对象的构造函数并不意味着具有显示对话框之类的副作用。构造函数的目标是通过初始化其字段来创建具有特定状态的对象,以便以后使用该对象。

你的例子没有做这样的事情。您将创建一个 MyDialog 实例,并且不对其执行任何操作。构造函数要做的就是产生一个巨大的副作用:显示一个对话框。

此设计中的另一个坏点是您使用实例字段来存储实际上是常量的值,与任何特定的 MyDialog 实例无关,并且仅与构造函数相关。根本没有理由拥有这样的领域。

最后,您的方法不遵守 Java 命名约定:方法以小写字母开头。它应该命名为showDialog() 而不是makeDialog,因为它不会创建一个对话框,而是显示一个。

【讨论】:

  • 好的,我编辑了我的代码。请再次掠夺它,让我知道你的想法。感谢您指出所有其他错误。
  • 一个后续问题:是每个对话框做几百个类还是一个类但是很多静态方法来创建对话框更好?
  • 和以前一样。您的构造函数所做的只是产生副作用。顺便说一句,您将您的班级称为“MyDialog”。这应该意味着如果您的代码执行MyDialog d = new MyDialog()n,您将拥有一个 MyDialog 的对象。 d 是对话吗?不,这不是对话。对话框是可以显示和隐藏的东西。你将无法使用d 做任何事情。
  • 好的,谢谢你的澄清。最后一个问题:如果可能的话,我怎样才能从内存中完全删除对象 d? “完全删除”是指,当我尝试调用 d.toString() 时,Java 编译器会给我一些错误,例如 nullpointerexception?
  • 一旦 d 超出范围,如果 d 引用的对象不再可达,那么它就有资格进行 GC。您似乎对内存使用很着迷。不。 Java 垃圾收集器运行良好。学习面向对象设计。无论如何,如果这还不够清楚,那么无论如何您都不应该创建 MyDialog 实例。
【解决方案2】:

恐怕这个问题太笼统了,无法回答,因为您要问的是 GUI 设计的任何和所有用例。

让我来参考你提到的具体场景,这是一个对话框。

令人惊讶的是,Swing 对话的最佳实践是介于方法和类之间。

一方面,当在 Swing 中使用对话框时,最好为包含所有 GUI 的面板创建一个新类,并将成为对话框的内容窗格。另一方面,您应该创建一个方法来创建(并且可能还显示)对话框。在该方法中,您将执行以下操作:

  • 创建一个 JDialog 的实例(通常不需要子类化)
  • 创建自定义面板类的实例(例如 MyDialogContentPaneClass)
  • 将面板设置为对话框的内容窗格
  • 显示和/或返回对话框

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多