2010-04-12 2 views
5

Я расширенной JDialog создать пользовательский диалог, в котором пользователь должен заполнить некоторые поля: dialog http://www.freeimagehosting.net/uploads/3d4c15ed9a.jpgПолучить вход введенный в JDialog

Как я должен получить вошли данные?

Я придумал решение, которое работает. Он имитирует JOptionPane, но так, как я делаю это выглядит некрасиво со мной из-за статических полей, участвующих ... Вот примерно мой код:

public class FObjectDialog extends JDialog implements ActionListener { 
    private static String name; 
    private static String text; 
    private JTextField fName; 
    private JTextArea fText; 
    private JButton bAdd; 
    private JButton bCancel; 

    private FObjectDialog(Frame parentFrame) { 
     super(parentFrame,"Add an object",true); 
     // build the whole dialog 
     buildNewObjectDialog(); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     if(ae.getSource()==bAdd){ 
      name=fName.getText(); 
      text=fText.getText(); 
     } 
     else { 
      name=null; 
      text=null; 
     } 
     setVisible(false); 
     dispose(); 
    } 

    public static String[] showCreateDialog(Frame parentFrame){ 
     new FObjectDialog(parentFrame); 
     String[] res={name,text}; 
     if((name==null)||(text==null)) 
      res=null; 
     return res; 
    } 
} 

Как я уже говорил, что работает правильно, но я думаю, что может вызвать серьезные параллельные проблемы ...

Есть ли более чистый способ сделать это? Как это делается в JOptionPane?

+0

Какой внешний вид вы используете? –

+1

@Martijn Courteaux: Nimbus (http://stackoverflow.com/questions/2616448/im-tired-of-jbuttons-how-can-i-make-a-nicer-gui-in-java) ;-) –

ответ

10

Если я это делаю, я всегда работаю так:

FObjectDialog fod = new FObjectDialog(this); 
fod.setLocationRelativeTo(this); // A model doesn't set its location automatically relative to its parent 
fod.setVisible(true); 
// Now this code doesn't continue until the dialog is closed again. 
// So the next code will be executed when it is closed and the data is filled in. 
String name = fod.getName(); 
String text = fod.getText(); 
// getName() and getText() are just two simple getters (you still have to make) for the two fields their content 
// So return textField.getText(); 

Надеется, что это помогает!
PS: Ваша программа отлично смотрится!

+0

Ooooooooh конечно ! Я не знаю, почему я застрял с этими статическими полями ... На мой взгляд, объект был уничтожен после удаления окна, но на самом деле это не так. Благодаря ! –

1

Если вы намерены одновременно отображать несколько диалоговых окон, тогда у вас есть проблемы параллелизма, а не иначе. Однако избавление от всех статических вещей сделало бы дизайн более чистым, безопасным и более простым в тестировании. Просто контролируйте создание и показ диалога из вызывающего кода, и вам не нужны какие-либо статические вещи.

 Смежные вопросы

  • Нет связанных вопросов^_^