繁体   English   中英

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

[英]Java can't call simple JDialog built using eclipse WindowBuilder

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

谁能指出我做错了什么?

提前致谢!

您构造一个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();

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

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

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

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

编辑:

注意到你的类扩展了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();
    }
}

并在您的main方法中调用showMyDialog

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM