主要课程:
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"在文本区请帮助我!
答案 0 :(得分:4)
想一想,谁负责更新JTextArea
,apple
或doctor
?
如果您回答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