我从另一个类更新textArea时遇到问题。
我需要一个textArea才能在按下按钮时显示文本。
因此,当我按下按钮时,我在ParceListener中创建一个actionPerformed()方法以在位于MainFormAppearance类中的textArea中打印文本。但这并没有做到。请你帮助我好吗?
public class Main {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame jFrame = new JFrame("Title");
MainFormAppearance demo = new MainFormAppearance();
jFrame.setContentPane(demo.createContentPanel());
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.setSize(400,300);
jFrame.setVisible(true);
}
}
MainForm外观
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainFormAppearance {
public JPanel totalGui;
public JTextArea frame;
public JLabel blueLabel;
public JButton parceButton;
public JButton mailButton;
public ParceListener parceListener;
public JPanel createContentPanel(){
totalGui = new JPanel();
frame = new JTextArea();
blueLabel = new JLabel("Some program");
parceButton = new JButton("Button 1");
mailButton = new JButton("Button 2");
parceListener = new ParceListener();
totalGui.setLayout(null);
//set program window
blueLabel.setLocation(10,10);
blueLabel.setSize(400,20);
blueLabel.setHorizontalAlignment(SwingConstants.CENTER);
blueLabel.setForeground(Color.blue);
totalGui.add(blueLabel);
//set Button 1
parceButton.setLocation(270, 50);
parceButton.setSize(100,30);
totalGui.add(parceButton);
//Pressing the Button 1
parceButton.addActionListener(parceListener);
//set Button 2
mailButton.setLocation(270, 100);
mailButton.setSize(100, 30);
totalGui.add(mailButton);
frame.setLocation(20, 115);
frame.setSize(200, 15);
totalGui.add(frame);
totalGui.setOpaque(true);
return totalGui;
}
public void setTextArea(String myString){
frame.append(myString);
}
}
ParceListener
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ParceListener implements ActionListener {
public String text = "some text";
MainFormAppearance mainFormAppearance = new MainFormAppearance();
public void actionPerformed(ActionEvent e) {
mainFormAppearance.setTextArea(text);
}
}
它在frame.append(myString);处显示NullPointerException;在MainFormAppearance类中。
最佳答案
在MainFormAppearance mainFormAppearance = new MainFormAppearance();
中调用ParceListener
正在创建MainFormAppearance
的新实例,该实例与屏幕上实际显示的内容无关。
您需要某种方法将信息从ParceListener
返回到主UI。
这最好使用观察者模式来完成,其中,当某些更改时,ParceListener
会生成通知/事件。它不应该关心“谁”感兴趣,而只关心它们。
让我们从一个简单的界面开始...
public interface ParceObserver {
public void parceChanged(String text);
}
MainFormAppearance
现在可以实现此interface
并进行所需的更新。public class MainFormAppearance implements ParceObserver {
//...
public void parceChanged(String text) {
frame.append("\n" + text);
}
}
然后,这里的
ParceListener
不在乎通知发布后会发生什么。现在,您只需要将
ParceObserver
的实例传递给ParceListener
parceListener = new ParceListener(this);
并更新
ParceListener
以利用它...public class ParceListener implements ActionListener {
private ParceObserver observer;
public String text = "some text";
public ParceListener(ParceObserver observer) {
this.observer = observer;
}
public void actionPerformed(ActionEvent e) {
if (observer == null) {
return null;
}
observer.parceChanged(text);
}
}
现在,它可以很好地分离和重新使用。
而且,如果有人告诉您仅将
JTextArea
或MainFormAppearance
的引用传递给ParceListener
,请不要听他们的话。这是不适当的,紧密耦合您的代码并使组件面临以从未希望过的方式被修改的风险