【问题标题】:How can I reach swing elements from a listener?如何从听众那里获得摇摆元素?
【发布时间】:2013-07-23 17:36:18
【问题描述】:

我目前正在学习如何使用 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();

并且仍然能够使这个外部侦听器访问主类中元素的属性。

【问题讨论】:

    标签: java swing class listener implementation


    【解决方案1】:

    是的,你可以。但是您需要将组件显式传递给侦听器,而不是将它们隐式传递给匿名类:

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

    而在main方法中:

    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 组件。仅来自美国东部时间。阅读swing concurrency tutorial
    • 您应该在添加组件之后调用pack()setVisible()revalidate() 在这种情况下是没用的。不要打电话给setSize()。布局管理器和pack() 方法的作用是找到框架的适当尺寸。

    【讨论】:

    • 感谢您的澄清。您提供的听众信息非常有帮助。关于主线程中的swing用法我会研究一下,但是我给出的例子只是我学习过程中的一个方便。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2020-06-17
    • 2015-07-18
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多