如何从其他类访问textarea?

时间:2014-12-07 10:08:15

标签: java jpanel awt jbutton jtextarea

主要课程:

public class tuna {
    public static void main(String[] args) {   
        JFrame frame1 = new JFrame();           
        frame1.setVisible(true);
        frame1.add(new apple());
        frame1.setSize(200  , 240);    
    }
}

第二课

public class apple extends JPanel{
    JTextArea ta = new JTextArea();
    Border blackline = BorderFactory.createLineBorder(Color.black); 
     apple(){
         setBorder(blackline);
         System.out.println("apple");
         ta.setText("hello");
         ta.setEditable(false);
         add(ta);
         add(new doctor());
         repaint();
         revalidate();      
    }
}

第3课

    public class doctor extends JPanel implements ActionListener{
    public JButton butt = new JButton("change");
    Border blackline = BorderFactory.createLineBorder(Color.black); 
    public doctor(){
        setBorder(blackline);
        add(butt);
    }   
    @Override
    public void actionPerformed(ActionEvent e){     
        if(e.getSource() == butt)
        {   
           System.out.println("she");
        }

    }
}

为什么每次按下按钮都不会打印"她"在控制台中。 每次按下按钮,我都需要我的程序来更改文本区域内的文本。 例如,当我按下按钮时,它应该附加" world"在文本区请帮助我!

2 个答案:

答案 0 :(得分:4)

想一想,谁负责更新JTextAreaappledoctor

如果您回答apple,那么您是对的,apple应该保持对组件的控制并控制对组件的访问。

在扩展中,doctor没有理由知道或关心apple或它可以做什么,它只需要能够向感兴趣的各方提供某些条件已经改变的通知,它不应该关心其他课程对这些信息的处理方式,因为它超出了其一般责任范围。

这是Observer Pattern的典型示例,其中一个(或多个)感兴趣的人观察对另一个人的更改并对其采取行动。

现在,问题是,如何最好地实现这一目标?有许多解决方案,你可以推出自己的监听器interface,你可以使用预先存在的监听器,如ChangeListener,或者你可以使用组件提供的内置功能。你选择哪个将取决于你的要求,保持简单,我正在使用最后一个......

当您创建doctor的实例时,可以向其添加PropertyChangeListener ...

doctor doc = new doctor();
doc.addPropertyChangeListener("change", new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        Object newValue = evt.getNewValue();
        if (newValue instanceof String) {
            ta.setText(newValue.toString());
        } else if (newValue == null) {
            ta.setText(null);
        }
    }
});
add(doc);

butt ActionListener中,您会触发PropertyChangeEvent ...

@Override
public void actionPerformed(ActionEvent e){     
    if(e.getSource() == butt)
    {   
        // If you want to, you could pass the "old" value
        firePropertyChange("change", null, "she");
    }
}

作为一个可能的例子......

答案 1 :(得分:2)

您必须为按钮指定侦听器:

butt.addActionListener(this)

要在文字区域进行更改,您必须执行字段ta public:

public JTextText ta;

创建时将apple实例传递给doctor实例:

new doctor(this)

然后在doctor中保存对该实例的引用:

private apple instance;

actionPerformed方法中,您可以使用文本区域进行操作:

instance.ta.setText("Some text.");

或者您可以在apple课程中添加方法,将文字设置为文字区域:

public void setTextAreaText(String text) {
    ta.setText(text);
}

actionPerformed

instance.setTextAreaText("Some text.");

注意:考虑课堂和课程varialbe命名:old doc