将参数传递给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
是一个全局变量,但我讨厌这样做的方式。 还有更好的选择吗?
- 创建一个实现
ActionListener
接口的类。 - 提供具有
JTextField
参数的构造函数。
示例 –
class Foo implements ActionListener{ private final JTextField textField; Foo(final JTextField textField){ super(); this.textField = textField; } . . . }
问题?
2种方式
-
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() ); } }); ... }
-
让
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() ); } }); ...