将参数传递给JButton ActionListener

时间:2012-03-29 17:49:32

标签: java swing jbutton actionlistener

我正在寻找一种方法将变量或字符串或任何东西传递给JButton的匿名actionlistener(或显式actionlistener)。这就是我所拥有的:

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 个答案:

答案 0 :(得分:10)

  1. 创建一个实现ActionListener接口的类。
  2. 提供具有JTextField参数的构造函数。

  3. 示例 -

    class Foo implements ActionListener{
        private final JTextField textField;
    
        Foo(final JTextField textField){
            super();
            this.textField = textField;
        }
        .
        .
        .
    }
    

    问题?

答案 1 :(得分:3)

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() );
          }
        });
      ...
      }
    

答案 2 :(得分:1)

在这种情况下使用Action和AbstractAction可能更好,你可以在那里做那种事情。

答案 3 :(得分:1)

从我在这里看到的代码中,entry不是一个全局变量。它是addDialog()方法中的局部变量。我误解了你吗?

如果将本地变量声明为final,则侦听器将能够访问它。

    final JTextField entry = new JTextField( "Entry Text", 20 );
    ...
    addButton.addActionListener( new ActionListener( ) {
      public void actionPerformed( ActionEvent e )
      {
        System.out.println( entry.getText() );
      }
    });
  ...