2012-05-10 64 views
6

我想用windowBuilder制作一个定制的JDialog,但是在开始时我遇到了一些问题。所以他们在这里:Java无法调用使用eclipse构建的简单JDialog WindowBuilder

我使用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); 
      } 
     } 
    } 

} 

但后来我想改变公共静态无效的主要(字串[] args)喜欢的东西公共无效秀()

新的show()方法的代码是:

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

所以,当我triyng使用下面的代码来调用这个方法改变:

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

有人能指点我做错了什么吗?

在此先感谢!

+0

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

+0

对不起,更正。 –

回答

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); 
} 

此方法将因此被称为本:

GroupFrame.createAndShow(); 

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

+0

谢谢,你的帖子使一切都变得更清晰。捕捉异常有什么问题?这是一个不好的做法? –

+2

是的,这是一个不好的做法。只捕获你可以处理的异常。如果你不能处理它,让它上升到可以处理的程度。 –

3

但是,然后我想改变公共无效显示()的公共无效的主要(字符串[] ARGS) 。

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

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

编辑:

注意到你的类扩展JDialog,这意味着如果你再次定义节目,你在技术上覆盖方法存在Dialog,而且显示已被弃用。

从文档:

已过时。从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应用程序运行,如果一些其它的类会调用你的表演方法,那么你就不需要在类的主要方法存在。

相关问题