Введите текст в jtextarea из другого класса

У меня проблема с обновлением textArea из другого класса. Мне нужен textArea для отображения текста при нажатии кнопки. Поэтому, когда я нажимаю кнопку, я использую метод actionPerformed () в ParceListener для печати текста в textArea, который находится в классе MainFormAppearance. Но этого не происходит. Не могли бы вы мне помочь?

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);

}

}

Он показывает исключение NullPointerException в frame.append (myString); в классе MainFormAppearance.

1
0
28
1

Ответы 1

Вызов MainFormAppearance mainFormAppearance = new MainFormAppearance(); в вашем ParceListener создает новый экземпляр MainFormAppearance, который не имеет ничего общего с тем, что фактически отображается на экране.

Вам нужен какой-то способ вернуть информацию обратно в основной пользовательский интерфейс из ParceListener.

Лучше всего это сделать с помощью шаблона наблюдателя, когда 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, пожалуйста, не слушайте их. Это неуместно, тесно связывает ваш код и подвергает компоненты риску модификации таким образом, как вы не планировали.

Другие вопросы по теме