Перекрестные ссылки с действием на Jbutton - PullRequest
0 голосов
/ 19 декабря 2011

Извините за мой английский, я недостаточно хорош.

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

У меня есть рамка:

public class JFrameVcView extends JFrame {
       ...
        private void init() {
              ...
              JButton jButtonFilter = new JButton(new FilterAction(this, "Filter"));
              ...
       }
  }

Мой класс FilterAction выглядит следующим образом:

public class FilterAction extends AbstractAction {
private final JFrameVcView fenetre;
private final List<JTextField> textFieldList;

public FilterAction(JFrameVcView fenetre, String texte) {
super(texte);
this.fenetre = fenetre;
this.textFieldList = fenetre.getTextFieldList();
}

@Override
public void actionPerformed(ActionEvent e) {
for (JTextField jtf : textFieldList) {
    System.out.println("name : " + jtf.getName() + " value : " + jtf.getText());
}
}

}

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

Спасибо.Shoxolat.

1 Ответ

0 голосов
/ 19 декабря 2011

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

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

Самый чистый способ, вероятно, состоит в том, чтобы создать фрейм, и как только фрейм будет полностью создан, создайте все действия, ссылающиеся на фрейм. Таким образом, вы убедитесь, что не выходите из кадра, пока он не будет использован:

private JFrameVcView () {
    // calls the init() method which creates all the components
}

private void createActions() {
    // create the actions and sets them on the buttons.
}

public static JFrameVcView createFrame() {
    JFrameVcView view = new JFrameVcView(); // calls the init() method which creates all the components
    view.createActions(); // when this method is called, the frame has all its buttons
    return view;
}

Вы также можете вызвать fenetre.getTextFieldList() в методе actionPerformed действия вместо вызова его в конструкторе.

...