-1

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

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

4

1 回答 1

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

另外,请注意:

  • 您不应该从主线程访问 swing 组件。仅来自美国东部时间。阅读摇摆并发教程
  • 您应该在添加组件之后调用pack()and 。在这种情况下是没用的。不要打电话。它是布局管理器的角色,也是寻找框架适当尺寸的方法。setVisible() revalidate()setSize()pack()
于 2013-07-23T18:08:19.007 回答