Java Swing: как получить доступ к переменным во 2-м кадре из первого? - PullRequest
1 голос
/ 08 июля 2010

Я программирую настольное приложение на Java , используя NetBeans .

Мой вопрос такой:

1-й: у меня есть Jframe, который является основным фреймом приложения.

2-й: В какой-то момент я хочу создать какой-то новый объект, поэтому я нажимаю addButton и создаю новый JFrame (я создаю новое окно класса, расширяющее Jframe) с некоторыми текстовыми полями в нем.

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
    w = new window();
    w.setVisible(true);
}

это скриншот, упрощенный простой строкой вместо полного класса http://img820.imageshack.us/img820/3361/screenshotlw.png

3-й: В этом новом окне я прочитал текстовые поля и создал объект, когда нажимаю какую-то кнопку.

Наконец, когда я нажимаю кнопку подтверждения, я хочу, чтобы новый кадр получил объект во 2-м кадре.

Вопрос : какой самый элегантный / эффективный / простой / лучший способ получить объект во 2-м кадре из первого?.

Мое первое решение: было создать статический метод setNewData() в первых окнах, и второе окно вызывает этот метод при нажатии кнопки.

Теперь я пришел с новым решением : На втором кадре у меня есть метод, чтобы установить мышиный слушатель на кнопку. И getString() Функция.

На первом кадре я получил это:

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
    w = new window();
    w.setHandler(ml);
    w.setVisible(true);
}

MouseListener ml = new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        TextFieldOn1stFrame.setText(w.getString());
    }
};

И на втором кадре я получил это

public void setHandler(MouseListener ml){
    button1.addMouseListener(ml);
}

public String getString(){
    return texto.getText();
}

Примечание: извините за длинный текст, я новичок в Java и не знаю, являются ли эти решения лучшими. Кстати извините за мой английский тоже.

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Я не знаю, является ли это стандартным способом работы Swing, но то, что я делаю, когда родительское окно должно быть уведомлено, когда дочернее окно выполнило какое-то действие, - это создание моего собственного интерфейса слушателя для этого дочернего окна.,Затем я создаю класс, который реализует интерфейс в моем родительском окне, и передаю экземпляр этого класса в дочернее окно.Затем дочерний элемент вызывает метод интерфейса, когда выполняется конкретное действие.Поэтому в вашей ситуации я бы сделал следующее:

(Примечание. Для обработки нажатий кнопок лучше использовать ActionListener вместо MouseListener.)

Интерфейс Frame2Listener

public interface Frame2Listener{
  void theButtonWasClicked(String textBoxValue);
}

Frame1 (родитель)

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) {
  w = new window(new Frame2Listener(){
    public void theButtonWasClicked(String textBoxValue){
      TextFieldOn1stFrame.setText(textBoxValue);
    }
  });
  w.setVisible(true);
}

Frame2 (ребенок)

public window(final Frame2Listener fl){
  button1.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
      fl.theButtonWasClicked(texto.getText());
    }
  });
}
public void setHandler(MouseListener ml){
  //delete this method
}
public String getString(){
  //delete this method
}

Мне бы хотелось услышать мнение любого эксперта по Swing, является ли это хорошей техникой или нет.

Надеюсь, вам нравится Java!;)

2 голосов
/ 08 июля 2010

Ну, у меня недостаточно представителей, чтобы прокомментировать решение mangst, но я хотел бы добавить, что при использовании слов «элегантный и эффективный» это казалось отличной возможностью для некоторых шаблонов проектирования.

То, что mangst описал, является реализацией шаблона Observer (http://en.wikipedia.org/wiki/Observer_design_pattern).. Я бы, однако, предложил иметь коллекцию объектов, реализующих интерфейс, как предложено mangst. Таким образом, после данного обновления вы можете итерация по множеству наблюдателей для выполнения определенных действий в каждом из них, будь то изменение данных, представление и т. д. Если нескольким окнам когда-либо понадобится получить данные / действие из дочернего окна, просто добавьте другое в список наблюдателей, которые вы уже сделали есть.

Существует также паттерн «Посредник» (http://en.wikipedia.org/wiki/Mediator_pattern), который может достигать аналогичных результатов.

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

1 голос
/ 08 июля 2010

Лучший способ, вероятно, - передать этот объект другому классу, используя его конструктор или правильный метод установки.

public void setWindow(Window w) {
  this.w = w;
  // now you can use "w" variable in whole class
}
...