【问题标题】:Java can't call simple JDialog built using eclipse WindowBuilderJava无法调用使用eclipse WindowBuilder构建的简单JDialog
【发布时间】:2012-05-18 21:31:25
【问题描述】:

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

谁能指出我做错了什么?

提前致谢!

【问题讨论】:

  • 而show()方法的代码是?

标签: java swing jdialog


【解决方案1】:

但是我想将 public static void main(String[] args) 更改为 像 public void show() 这样的东西。

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

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

编辑:

注意到您的类扩展了 JDialog,这意味着如果您再次定义 show,从技术上讲,您将覆盖 Dialog 中的方法,而且 show 已被弃用。

来自文档:

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

使对话框可见。如果对话框和/或其所有者尚未 displayable,两者都可以显示。对话框将是 在变得可见之前进行验证。如果对话框已经 可见,这会将对话框带到前面。 如果对话框是模态的并且尚不可见,则此调用将不会返回,直到通过调用 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 方法存在你的班级。

【讨论】:

    【解决方案2】:

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

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

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

    因此,该方法将被称为:

    GroupFrame.createAndShow();
    

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

    【讨论】:

    • 谢谢,你的帖子让一切变得更清楚了。捕获异常有什么问题?这是一种不好的做法?
    • 是的,这是一种不好的做法。仅捕获您可以处理的异常。如果你不能处理它,让它上堆栈直到它可以处理。
    猜你喜欢
    • 2017-06-06
    • 2016-03-29
    • 2023-03-29
    • 2017-11-24
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多