Java 如何从另一个类访问textarea?

Java 如何从另一个类访问textarea?,java,jpanel,awt,jbutton,jtextarea,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 c

主要类别:

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

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

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

必须为按钮指定侦听器:

butt.addActionListener(this)
要在文本区域中进行更改,必须执行字段
ta
public:

public JTextText ta;
创建时将
apple
实例传递给
doctor
实例:

new doctor(this)
然后在
doctor
中保存对该实例的引用:

private apple instance;
actionPerformed
方法中,您可以对文本区域进行操作:

instance.ta.setText("Some text.");
public void setTextAreaText(String text) {
    ta.setText(text);
}
或者,您可以将方法添加到
apple
类中,以将文本设置为文本区域:

instance.ta.setText("Some text.");
public void setTextAreaText(String text) {
    ta.setText(text);
}
执行的操作中

instance.setTextAreaText("Some text.");

注意:考虑类和变量命名:

考虑一下,谁负责更新
JTextArea
apple
doctor

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

扩展而言,
doctor
没有理由知道或关心
apple
或它能做什么,它只需要能够向相关方提供通知,告知某些情况发生了变化,它不应该关心其他类如何处理这些信息,因为这超出了它的一般责任范围

这是一个典型的示例,其中一个(或多个)相关方观察到另一个的更改并对其采取行动

现在的问题是,如何最好地实现这一点?有许多解决方案,您可以滚动您自己的侦听器
接口
,您可以使用预先存在的侦听器,如
更改侦听器
,或者您可以使用组件提供的内置功能。您选择哪一个取决于您的需求,为了保持简单,我使用最后一个

创建
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
中,您将触发
属性更改事件

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

作为一个可能的例子…

感谢它解决了一个小问题,它应该是butt.addActionListener(this)“要在文本区域进行更改,您必须执行字段ta public:“这不是真的,事实上可能是您可以做的第二糟糕的事情(
static
最糟糕)。您应该尽可能避免将UI元素暴露给外部修改。现在,这允许代码对
JTextArea
执行各种讨厌的操作,比如将其从父容器中移除或移动到新容器中。管理组件的责任是容器类,其他想要更改的类应该通过setter来完成…我写了setter,正如你所说的?不管怎么说,IMHO,我认为作者的代码没有任何意义去观察smth.True,但也暴露给代码中不需要访问的组件,也不应该关心这些组件。还有更好的解决方案……请原谅我的“肛门保留”,我花了6年的大部分时间来纠正那些本该更清楚的人犯下的此类错误,所以当我看到这些错误时,我会感到很难过;)这就解决了问题!但是如果我想给它添加一个文本,而不是更改整个文本,怎么样?@PNC不用担心,很容易错过