Java无法调用使用eclipse WindowBuilder构建的简单JDialog

mr.*_*ing 6 java swing jdialog

我正在尝试使用windowBuilder创建自定义JDialog,但在一开始我遇到了一些问题.所以他们在这里:

我使用windowBuilder创建了简单的Jdialog.这是代码:

public class GroupFrame extends JDialog {

    private final JPanel contentPanel = new JPanel();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            GroupFrame dialog = new GroupFrame();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     */
    public GroupFrame() {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("OK");
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

但后来我想将public static void main(String [] args)更改为public void show().

新的show()方法代码是:

public void show() {
        try {
            GroupFrame dialog = new GroupFrame();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

因此,当我使用以下代码调用此更改的方法时:

GroupFrame groupFrame = new GroupFrame();
groupFrame.show(); 
Run Code Online (Sandbox Code Playgroud)

我有StackOverflowError(真是巧合!; D):

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
    at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
    at java.awt.Window.init(Unknown Source)
    at java.awt.Window.<init>(Unknown Source)
    at java.awt.Window.<init>(Unknown Source)
    at java.awt.Dialog.<init>(Unknown Source)
    at java.awt.Dialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at javax.swing.JDialog.<init>(Unknown Source)
    at UILayer.GroupFrame.<init>(GroupFrame.java:32)
    at UILayer.GroupFrame.show(GroupFrame.java:21)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at java.awt.Dialog.setVisible(Unknown Source)
    at UILayer.GroupFrame.show(GroupFrame.java:23)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at java.awt.Dialog.setVisible(Unknown Source)
    at UILayer.GroupFrame.show(GroupFrame.java:23)
    (etc...)
Run Code Online (Sandbox Code Playgroud)

谁能指出我做错了什么?

提前致谢!

JB *_*zet 4

您构造一个 GroupFrame,然后调用 show() 方法,该方法构造另一个 GroupFrame。这已经是错误的了。但它更错误,因为然后你调用setVisible(true)它在内部调用show()你无意中覆盖的方法。

show 方法应该命名为其他名称,并且应该是静态的:

public static GroupFrame createAndShow() {
    GroupFrame dialog = new GroupFrame();
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

因此,该方法将被称为:

GroupFrame.createAndShow();
Run Code Online (Sandbox Code Playgroud)

请不要捕获异常。当你这样做时,不要吞下异常。

  • 是的,这是一个不好的做法。只捕获您可以处理的异常。如果你无法处理它,就让它进入堆栈,直到它可以处理为止。 (2认同)