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不用担心,很容易错过