2012-05-10 1 views
6

Я пытаюсь создать пользовательский JDialog с помощью windowBuilder, но в начале я столкнулся с некоторыми проблемами. Итак, вот они:Java не может вызвать простой JDialog, построенный с использованием eclipse WindowBuilder

Я создал простой Jdialog, используя windowBuilder. Вот его код:

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

} 

Но я хочу изменить государственного статической силы основного (String [] арг) к чему-то вроде общественных ничтожных шоу().

Новое шоу() метод код:

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(), который вы случайно перевернули.

Метод шоу должно называться что-то другое, и должно быть статическим:

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

Этот метод, таким образом, можно назвать как это:

GroupFrame.createAndShow(); 

И пожалуйста, не поймать исключение. И когда вы это сделаете, не проглатывайте исключение.

+0

Спасибо, ваше сообщение сделало все более ясным. И в чем проблема с улавливанием исключения? Это плохая практика? –

+2

Да, это плохая практика. Исключайте только исключения, с которыми вы можете справиться. Если вы не можете справиться с этим, пусть он поднимается вверх по стеку, пока он не будет обработан. –

3

Но тогда я хочу изменить public static void main (String [] args) на что-то вроде public void show().

Вы не можете этого сделать, основным методом с точной подписью является отправная точка программы Java (для большинства случаев, но не для всех).

Что вам нужно, это отдельный show метод, который сделает ваш диалог видимого

EDIT:

Заметили ваш класс расширяет 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(); 
    } 
} 

и в основной метод вы звоните showMyDialog.

Но основной метод должен присутствовать в вашем классе, если вы хотите, чтобы он выполнялся как Java-приложение , если какой-либо другой класс будет вызывать ваш метод show, тогда вам не нужно существование основного метода в вашем классе.