Java 如何从侦听器访问swing元素?
我目前正在学习如何使用ActionListeners,我有一些关于如何使用ActionListeners的问题Java 如何从侦听器访问swing元素?,java,swing,class,listener,implementation,Java,Swing,Class,Listener,Implementation,我目前正在学习如何使用ActionListeners,我有一些关于如何使用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.setDefault
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();
并且仍然能够使这个外部侦听器访问主类内部元素的属性。是的,您可以。但是您需要将组件显式地传递给侦听器,而不是隐式地传递给anonyous类:
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());
}
}
}
此外,请注意:
- 您不应该从主线程访问swing组件。只有美国东部时间。读这本书
- 添加组件后,应调用
和pack()
<代码>重新验证()在这种情况下无效。不要调用setVisible()
。布局管理器和setSize()
方法的作用是找到框架的适当尺寸pack()