为什么这个ActionListener不起作用?

时间:2013-02-10 21:52:14

标签: java swing actionlistener

我只是学习使用ActionListener并使小部件正常工作。 这是我想要打印JTextField中所输入内容的简单程序。

TextViewer1

import javax.swing.JFrame;

public class TextViewer1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame frame = new TextFrame1();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }

}

TextFrame1

import java.awt.event.ActionListener;
import javax.swing.*;

public class TextFrame1 extends JFrame {
    private static final int FRAME_WIDTH = 300;
    private static final int FRAME_HEIGHT = 200;

    public TextFrame1() {
        createComponents();
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
    }


    private void createComponents() {
        JPanel panel = new JPanel();
        add(panel);

        JTextField textbox = new JTextField(20);
        panel.add(textbox);

        String TYPED = textbox.getText();
        ActionListener sendsText = new TextListener();
        textbox.addActionListener(sendsText);


    }
}

的TextListener

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class TextListener implements ActionListener {

    /**
     * @param args
     */

    public void actionPerformed(ActionEvent event) {

        System.out.println(TYPED);

    }

}

所以问题是'TextListener'中的变量TYPED,它想要创建这个变量并初始化它。

有什么问题?

2 个答案:

答案 0 :(得分:2)

  

所以问题是'Text Listener'中的变量TYPED,它想要创建这个变量并初始化它。

这是因为TextListener中的变量未定义。您在TYPED中创建了一个名为TextFrame1#createComponents的本地变量,但这在actionPerformed TextListener中不可见。

实际上,您将变量分配给JTextField的初始文本,默认情况下为String。如果要获取组件的当前文本,可以将其传递给构造函数:

class TextListener implements ActionListener {

   private final JTextField textField;
   public TextListener(JTextField textField) {
    this.textField = textField;
   }

   @Override
   public void actionPerformed(ActionEvent event) {

      System.out.println(textField.getText());
   }
}

像这样创建TextListener

ActionListener sendsText = new TextListener(textbox);

答案 1 :(得分:2)

TYPED未声明为变量。所以要么声明它,要么用“”包围它。

编辑: 是的,你确实声明了它,但是作为TextFrame1类中createComponents函数内的局部变量。

您需要传递以下值:

public class TextListener implements ActionListener {
    private String typed;

    public TextListener(String typed) {
        this.typed = typed;
    }

    /**
     * @param args
     */

    public void actionPerformed(ActionEvent event) {

        System.out.println(typed);

    }

}

哦,变量不应该是大写,而是小写。大写是常量。

编辑2:我的不好,那个监听器构造函数应该接受String typed,而不是int typed。我修复了代码。至于你的另一个问题,那是因为你现在需要将输入结果传递给监听器声明。

 ActionListener sendsText = new TextListener(TYPED);

或者只是这样做:

 ActionListener sendsText = new TextListener(textbox.getText());