0

我有一个包含文本字段的类,并且在该类中包含一个包含操作执行方法的内部类。在输入文本并按 Enter 键时,我希望将文本分配给实现动作侦听器的内部类之外的字符串“s”。我想在另一个类中使用该字符串。

public class Peaches extends JFrame {
    private JTextField item1;

    public Peaches() {
        super("the title");
        setLayout(new FlowLayout());        
        item1 = new JTextField(10);
        add(item1);

    thehandler handler = new thehandler(); //object of thehandler inner class
    item1.addActionListener(handler);      

    // I want to use the textfield content here, or in other classes, updated
    // with the new text everytime i hit enter after entering new text in the textfield 

    //String s = the content of the textfield
}

private class thehandler implements ActionListener { // inner class
    @Override
    public void actionPerformed(ActionEvent event) {
        String string = "";           
        string = String.format(event.getActionCommand());            
        JOptionPane.showMessageDialog(null, string);           
    }
}

有没有办法做到这一点?必须可以在程序的其他部分使用文本字段的输入。我希望我能说清楚,谢谢大家。

编辑感谢您的回复,因此使变量字符串成为类变量而不是在构造函数中声明它允许整个类访问它,简单但我只是不明白。谢谢马尔科

4

5 回答 5

4

我建议你这样做:

public class Peaches extends JFrame {
  private JTextField item1;
  private String string;

  public Peaches() {
    super("the title");
    setLayout(new FlowLayout());
    item1 = new JTextField(10);
    add(item1);
    item1.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent event) {
        string = String.format(event.getActionCommand() );
        JOptionPane.showMessageDialog(null, string);
    }});
  }
}

这使用了一个匿名类,比周围有几十个内部类更简单。加上这些,您可以制作闭包(使用在匿名类之外声明的局部变量)。你的字符串在外面,所以你可以访问它。

于 2012-04-25T21:22:24.700 回答
1

我想在此处或其他类中使用文本字段内容,每次在文本字段中输入新文本后按回车键时都会使用新文本进行更新

简短的回答是,如果您希望每次更改文本字段中的值时都执行代码,则必须将侦听器附加到文本字段并通过侦听器触发该代码。这就是监听器的用途......唯一知道文本已更改的是文本字段,他将通知其监听器有关已进行更改的事实(观察者模式

如果您想在多个课程中了解此更改,您可以

  • 提供 API 以从当前类外部将侦听器附加到此特定文本字段
  • 提供 API 以从当前类外部直接访问文本字段
  • 将一个侦听器附加到更新某种模型的文本字段,并在不同类之间共享模型。当然,模型应该能够触发事件并通知侦听器有关更改,否则您将无法判断值何时更改。

是否使用内部类、匿名类、成熟类作为侦听器并不重要。

于 2012-04-25T21:34:49.687 回答
0

如果您将 s 移动为类变量而不是方法变量(目前在构造函数中已注释掉),它将起作用。

于 2012-04-25T21:14:18.493 回答
0

您可以将外部类作为内部类的构造函数中的参数传递。

于 2012-04-25T21:14:40.327 回答
0

您根本不需要内部类。只需在其中实现一个 ActionListenerPeaches并让它监听ActionEvent

public class Peaches extends JFrame implements ActionListener
{
    private JTextField item1;

    public Peaches()
    {
        super("the title");
        setLayout(new FlowLayout());        
        item1 = new JTextField(10);
        add(item1);

        item1.addActionListener(this);      
    }

    public void actionPerformed(ActionEvent event)
    {
        if (event.getSource() == item1){
            String string = "";           
            string = String.format(event.getActionCommand() );            
            JOptionPane.showMessageDialog(null, string);   
        }        
    }
}
于 2012-04-25T21:37:35.197 回答