Получить ввод, введенный в JDialog

Я расширил 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?


person Jules Olléon    schedule 12.04.2010    source источник
comment
Какой внешний вид вы используете?   -  person Martijn Courteaux    schedule 12.04.2010
comment
@Martijn Courteaux: Nimbus (заголовок stackoverflow.com/questions/2616448/) ;-)   -  person Jules Olléon    schedule 12.04.2010


Ответы (2)


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

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: Ваша программа выглядит великолепно!

person Martijn Courteaux    schedule 12.04.2010
comment
Ооооооооооо конечно! Я не знаю, почему я застрял с этими статическими полями... На мой взгляд, объект был уничтожен после удаления окна, но на самом деле это не так. Спасибо ! - person Jules Olléon; 12.04.2010

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

person fish    schedule 12.04.2010