С помощью Java Swing App, как получить значения из диалоговой панели в основное приложение? - PullRequest
2 голосов
/ 03 апреля 2010

В моем приложении Swing пользователи могут нажать кнопку, чтобы открыть диалоговую панель и ввести некоторые значения, затем они могут нажать «ОК» на этой панели, чтобы закрыть ее и вернуться в основную программу, но как я могу передать значения они входят в основную программу без предварительного сохранения их в файл?

Ответы [ 7 ]

2 голосов
/ 03 апреля 2010

Есть пара вещей, которые вы можете сделать:

  • Вы можете создать связь Observer / Observable между вашим приложением и диалогом и заставить диалоговое окно публиковать событие, когда диалоговое окно закрывается со значениями в событии.
  • Вы можете сохранить дескриптор своего диалога в своем приложении, а когда вы вызываете setVisible(false) в диалоговом окне, вы можете запросить диалог для его данных.
1 голос
/ 25 августа 2011

Просто определите интерфейс с помощью одного метода (например, «returnToCaller (returntype rt)») в вашем диалоговом классе.

Конструктор диалога принимает экземпляр этого интерфейса в качестве входных данных и использует его для возврата результатов при выходе / ok.

Основной модуль (окно или что-то еще) просто создает экземпляр диалога и, таким образом, анонимно использует интерфейс, определяя метод возврата, что-то вроде делегата (c #).

Вызов тогда будет:

    MyDialog md = new MyDialog(new MyDialog.ReturnToCaller() {
        public void returnToCaller(ReturnValues rv) {
                         // Handle the values here
        }
    });
    md.setModal(true);
    md.setVisible(true);
1 голос
/ 04 апреля 2010

Вместо того, чтобы использовать только плохой API Java Observable / Observer, я бы посоветовал вам взглянуть на " Event Bus ", который особенно подходит для вашей ситуации.

Две реализации Автобусов Событий:

  • EventBus очень общая шина событий, можно использовать в любой ситуации
  • Шина событий GUTS , специфичная для библиотеки внедрения зависимостей Guice

Один из них должен помочь вам решить вашу текущую проблему.

1 голос
/ 03 апреля 2010

Пользовательский интерфейс обычно должен быть наложен на основное приложение. (IMO, пользовательский интерфейс сам должен быть разбит на слои, но это еще одна напыщенная речь.) Передайте соответствующую часть вашего приложения для создания вашего пользовательского интерфейса. Когда вы будете готовы к переходу значений из пользовательского интерфейса в приложение (это может быть кнопка «ОК» в многостраничном диалоге вплоть до каждого нажатия клавиши), отправьте данные в компонент приложения.

0 голосов
/ 10 января 2013

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

Затем класс вашей диалоговой панели прослушивает кнопку «ОК» и, нажав кнопку, извлекает значения и использует их с вышеупомянутым методом.

class Main {
    //...
    private Dialog myDialog ;

    public Main(){
        //...
        myDialog = new Dialog(this);
        //...
    }

    //...

    public void onDialogOk(String valueA, int valueB)
    {
        //...
    }
}

class Dialog implement ActionListener{
    //...
    private Main myMain ;

    public setMain(Main main){
        myMain = main;
    }

    public Dialog(Main main){
        //...
        setMain(main) ;

        //...
        JButton ok = new JButton("ok") ;
        ok.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) { 
        // retrieve form values
        String valueA = ... ;
        int valueB = Integer.parse(...);
        myMain.onDialogOK(valueA, valueB) ; //DONE
    }
}
0 голосов
/ 04 апреля 2010

Может быть, вы хотели бы попробовать это решение:

class MyDialog {

private static String[] returnValues = new String[10]
private static MyDialog dialog;

private MyDialog() {
  initDialog()
}

private void closeDialog()
{
     dispose();
}

private initDialog()
{

 //....
 btnOk = new JButton("OK");
  jTextField1 = new JTextField();
  ...
  jTextField10 = new JTextField();
  ...
  ActionListener btnOK_click = new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            returnValues[0] = jTextField1.getText();
            ...
            returnValues[9] = jTextField10.getText();
            closeDialog();  
        }
  }
  btnOk.addActionListener(btnOk_click);
}

public static String[] showMyDialog() {
    dialog = new MyDialog();
    dialog.setVisible(true);
    return returnValues;
}

}

0 голосов
/ 03 апреля 2010

Я бы предложил дизайн MVC (Model-view-controller). Так что диалог будет у вас на виду и, возможно, контролером. Но должен быть доменный класс, который будет вашей моделью. Например, если диалоговое окно создано для редактирования личных данных, то у вас может быть класс с именем Person, который будет хранить данные. Диалог должен быть спроектирован так, чтобы вы могли настроить и получить персонажа из него.

...