6

我正在尝试使用 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);
            }
        }
    }

}

但是后来我想将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();
        }
    }

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

GroupFrame groupFrame = new GroupFrame();
groupFrame.show(); 

我有 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...)

有人可以指出我做错了什么吗?

提前致谢!

4

2 回答 2

4

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

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

public static GroupFrame createAndShow() {
    GroupFrame dialog = new GroupFrame();
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);
}

因此,此方法将被称为:

GroupFrame.createAndShow();

请不要抓住异常。当你这样做时,不要吞下异常。

于 2012-05-10T10:25:08.153 回答
3

但是后来我想将 public static void main(String[] args) 更改为 public void show() 之类的东西。

您不能这样做,具有确切签名的 main 方法是 Java 程序的起点(对于大多数情况但不是全部)。

您需要的是一个单独的show方法,它将使您的对话框可见

编辑:

注意到你的类 extends JDialog,这意味着如果你再次定义 show ,你在技术上覆盖了存在的方法Dialog,而且 show 已被弃用。

从文档:

已弃用。从 JDK 版本 1.5 开始,由 setVisible(boolean) 取代。

使对话框可见。如果对话框和/或其所有者尚未显示,则两者都可显示。该对话框将在可见之前进行验证。如果对话框已经可见,这会将对话框带到前面。如果对话框是模态的并且尚不可见,则此调用将不会返回,直到通过调用 hide 或 dispose 隐藏对话框。允许从事件调度线程显示模式对话框,因为工具包将确保另一个事件泵运行,而调用此方法的事件泵被阻塞。

而是使用这个:

public static void showMyDialog(){
    try {
         GroupFrame dialog = new GroupFrame();
         dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
         dialog.setVisible(true);
    } catch (Exception e) {
         e.printStackTrace();
    }
}

并在您的主要方法中调用showMyDialog.

但是,如果您希望它作为Java 应用程序运行,则您的类中必须存在 main 方法,如果其他类要调用您的 show 方法,那么您的类中不需要存在 main 方法。

于 2012-05-10T10:14:24.743 回答