gpt4 book ai didi

java - 在另一个类的 JTextArea 中输入文本

转载 作者:行者123 更新时间:2023-11-30 05:56:58 24 4
gpt4 key购买 nike

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


}

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 类中。

最佳答案

ParceListener 中调用 MainFormAppearance mainFormAppearance = new MainFormAppearance(); 会创建一个 MainFormAppearance 的新实例,它与什么无关实际上已经呈现在屏幕上。

您需要某种方法将信息从 ParceListener 返回到主 UI。

最好使用观察者模式来实现这一点,其中 ParceListener 在某些情况发生变化时生成通知/事件。它不应该关心“谁”感兴趣,而只关心他们感兴趣。

让我们从一个简单的界面开始......

public interface ParceObserver {
public void parceChanged(String text);
}

MainFormAppearance 现在可以实现此界面并进行所需的更新。

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,请不要听他们的。这是不合适的,它与您的代码紧密耦合,并使组件面临被以您从未想过的方式修改的风险

关于java - 在另一个类的 JTextArea 中输入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com