Java-Swing:正确的样式/约定/语法

时间:2016-02-13 00:35:20

标签: java swing user-interface styles

我对如何在Java中实现GUI感到困惑,因为有许多不同的方法。这个线程已经描述了这些正确的习惯:Java/Swing GUI best practices (from a code standpoint) 但我很困惑,因为在使用这种方法时,Netbeans在超类中调用的函数旁边说“构造函数中的可覆盖方法调用”。

我不问如何使用GUI或如何实现它们,但我要求实现它们的正确方法。我对这种格式持怀疑态度,因为出现了这个错误。运行这种格式的程序没问题。至少在节目非常小而且简单的时候。

我从上面提到的帖子中得到了这个示例代码:

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); //Overridable method call in constructor
        addWindowListener(new WindowAdapter() {   //Overridable method call in constructor
            @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();
    }
}

此错误发生在构造函数中继承和使用的任何其他方法。我知道这个帖子解释了为什么不这样做:What's wrong with overridable method calls in constructors?所以现在我问,这仍然是正确的风格吗?在实现GUI时这是否合适?

注意:不是一个非常有经验的程序员,所以我希望我正确地说明了一切。我想从一开始就学习这种方式的正确方式。

1 个答案:

答案 0 :(得分:0)

为避免在JFrame构造函数中放置一个可覆盖的方法,您必须在构造函数外部进行所有JFrame初始化,即:在main函数中。这通常是不好的做法,因为它可能导致帧的不同实例之间出现差异。所以是的,你做的一切都是正确的。 Netbeans有时会显示一些愚蠢的警告。