我目前正在学习如何使用ActionListeners,我对如何使用它有一些疑问。
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(0,1));
frame.setSize(250,250);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0,1));
final JTextField text1 = new JTextField(" ",10);
final JTextField text2 = new JTextField(" ",10);
final JTextField text3 = new JTextField(" ",10);
final JTextField text4 = new JTextField(" ",10);
panel.add(text1);
panel.add(text2);
panel.add(text3);
panel.add(text4);
ActionListener a = new ActionListener(){
public void actionPerformed(ActionEvent e){
text4.setText(text1.getText()+""+text2.getText()+""+text3.getText());
}
};
JButton buton = new JButton("Go");
buton.addActionListener(a);
frame.add(panel);
frame.add(buton);
frame.revalidate();
}
鉴于示例中的代码,这是我在主类中使用的唯一方法。正如你可以看到的那样,我正在使用一些在main()中实现的匿名监听器。事情是......我使用它们是因为单击框架中的按钮实际上需要更改另一个元素的内容。 我的问题是:你是否可以让听众非匿名,同时还能使用其他组件?我在想的是为另一个类中的按钮移动ActionListener实现,但是如何到达其他元素的属性? 示例:
class listener implements ActionListener{
public void actionPerformed(ActionEvent e){
text4.setText(text1.getText()+""+text2.getText()+""+text3.getText());
}
}
然后在我的main()类中我想简单地调用:
listener l = new listener();
buton.addActionListener();
并且仍然可以使这个外部监听器访问主类中元素的访问属性。
答案 0 :(得分:0)
是的,你可以。但是你需要明确地将组件传递给监听器,而不是将它们隐含地传递给恶意类:
class MyListener implements ActionListener {
private JTextField text1;
private JTextField text2;
private JTextField text3;
private JTextField text4;
public MyListener(JTextField text1, JTextField text2, JTextField text3, JTextField text4) {
this.text1 = text1;
this.text2 = text2;
this.text3 = text3;
this.text4 = text4;
}
@Override
public void actionPerformed(ActionEvent e){
text4.setText(text1.getText()+""+text2.getText()+""+text3.getText());
}
}
在主要方法中:
button.addActionListener(new MyActionListener(text1, text2, text3, text4);
通常,组件存储在对象的实例变量(通常是JPanel的子类)中,而侦听器实现为内部类(匿名或非匿名),因此可以直接访问实例变量:
public class MyPanel extends JPanel {
private JTextField textField;
private JButton button;
public MyPanel() {
// ...
button.addActionListener(new MyActionListener());
}
private class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(textField.getText());
}
}
}
另外,请注意:
pack()
和setVisible()
。 revalidate()
在这种情况下毫无用处。不要致电setSize()
。布局管理器和pack()
方法的作用是找到框架的适当尺寸。