2013-02-10 101 views
0

我只是学习使用ActionListener s并使小工具工作。 这是我的简单程序,我想打印任何我输入的JTextField为什么这个ActionListener不工作?

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

    } 

} 

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

有什么不对?

回答

2

So the problem is the variable TYPED in 'Text Listener', it wants to create this variable and initialise it.

这是因为该变量是在您的TextListener不确定的。您在TextFrame1#createComponents中创建了一个名为TYPED的局部变量,但在TextListeneractionPerformed中不可见。

实际上,您将变量分配给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); 
+0

感谢您的回应,仍然有一个错误:>>>在TextFrame1 >>> 的ActionListener sendsText =新的TextListener(类型);错误消息:构造函数TextListener(String)未定义 – 2013-02-11 21:53:04

+0

编号传入“JTextField”而不是文本本身。查看更新。 :) – Reimeus 2013-02-11 21:56:55

2

类型的未声明的变量。所以要么声明它,要么用“”包围它。

编辑: 是的,你确实声明了它,但作为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类型,不是int类型的。我修复了代码。至于您的其他问题,那是因为您现在需要将输入结果传递给侦听器声明。

ActionListener sendsText = new TextListener(TYPED); 

或者只是做:

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

我以为我宣布了它。 字符串TYPED =文本框。的getText(); 那么如何以及在何种I类应申报呢?我不知道你的意思是围绕它。 – 2013-02-10 22:03:17

+0

你宣称它在一流水平,但在动作侦听器的代码不可见。也为textarea的动作,你应当关心自己在关键监听 – 2013-02-10 22:04:33

+0

感谢你的帮助,但它仍然无法正常工作,实际上是在Eclipse上,它提供了2个不同的错误,第一>>的ActionListener sendsText =新的TextListener();错误:构造的TextListener()是不确定的。 第二错误:this.typed =键入;类型不匹配:不能从int转换为字符串 – 2013-02-10 22:26:27