将参数传递给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是一个全局变量,但我讨厌这样做的方式。 还有更好的选择吗?

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

示例 –

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

问题?

2种方式

  1. final entry因此可以在匿名类中访问它

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

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

从我在这里看到的代码,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() ); } }); ...