Передать аргументы в JButton ActionListener - PullRequest
4 голосов
/ 29 марта 2012

Я ищу способ передачи переменной, строки или чего-либо в анонимный список действий (или явный список действий) для JButton.Вот что у меня есть:

public class Tool {
...
  public static void addDialog() {
    JButton addButton = new JButton( "Add" );
    JTextField entry = new JTextField( "Entry Text", 20 );
    ...
    addButton.addActionListener( new ActionListener( ) {
      public void actionPerformed( ActionEvent e )
      {
        System.out.println( entry.getText() );
      }
    });
  ...
  }
}

Сейчас я просто объявляю entry глобальной переменной, но я ненавижу такой способ работы.Есть ли лучшая альтернатива?

Ответы [ 4 ]

10 голосов
/ 29 марта 2012
  1. Создание класса, реализующего интерфейс ActionListener.
  2. Предоставление конструктора с аргументом JTextField.

Пример -

class Foo implements ActionListener{
    private final JTextField textField;

    Foo(final JTextField textField){
        super();
        this.textField = textField;
    }
    .
    .
    .
}

Проблема?

3 голосов
/ 29 марта 2012

2 способа

  1. make entry final, чтобы к нему можно было обращаться в анонимном классе

    public static void addDialog() {
        JButton addButton = new JButton( "Add" );
        final JTextField entry = new JTextField( "Entry Text", 20 );
        ...
        addButton.addActionListener( new ActionListener( ) {
          public void actionPerformed( ActionEvent e )
          {
            System.out.println( entry.getText() );
          }
        });
      ...
      }
    
  2. сделать entry поле

    JTextField entry;
    public static void addDialog() {
        JButton addButton = new JButton( "Add" );
        entry = new JTextField( "Entry Text", 20 );
        ...
        addButton.addActionListener( new ActionListener( ) {
          public void actionPerformed( ActionEvent e )
          {
            System.out.println( entry.getText() );
          }
        });
      ...
      }
    
1 голос
/ 29 марта 2012

Из кода, который я вижу здесь, запись НЕ является глобальной переменной.Это локальная переменная в методе addDialog (). Я вас неправильно понял?

Если вы объявите переменную локально как final, слушатель сможет получить к ней доступ.

    final JTextField entry = new JTextField( "Entry Text", 20 );
    ...
    addButton.addActionListener( new ActionListener( ) {
      public void actionPerformed( ActionEvent e )
      {
        System.out.println( entry.getText() );
      }
    });
  ...
1 голос
/ 29 марта 2012

Может быть, лучше в этом случае использовать Action и AbstractAction, где вы могли бы делать подобные вещи.

...