我从另一个类更新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);
    }

}


现在,它可以很好地分离和重新使用。

而且,如果有人告诉您仅将JTextAreaMainFormAppearance的引用传递给ParceListener,请不要听他们的话。这是不适当的,紧密耦合您的代码并使组件面临以从未希望过的方式被修改的风险

10-04 14:05