[英]Type a text in JTextArea from another class
我在更新另一个类的 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);
}
}
主窗体外观
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);
}
}
包监听器
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
,不在乎发布通知后会发生什么。
现在,您只需要将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
,请不要听他们的。 这是不合适的,紧密耦合您的代码并使组件面临以您从未希望它们被修改的方式被修改的风险
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.