Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从侦听器访问swing元素?_Java_Swing_Class_Listener_Implementation - Fatal编程技术网

Java 如何从侦听器访问swing元素?

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

我目前正在学习如何使用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.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()
    方法的作用是找到框架的适当尺寸

感谢您的澄清。您提供的侦听器信息非常有用。关于主线程中的swing用法,我将对此进行研究,但我给出的示例只是通过我的学习过程为您提供了方便。