JAVA Swing:Can';t将文本附加到文本区域

JAVA Swing:Can';t将文本附加到文本区域,java,swing,Java,Swing,如果我按下一个按钮,我只是尝试将一个文本附加到一个文本区域。我将其分开,因此textArea在另一个名为TextPanel的类中创建。有趣的是,如果我按下那个按钮,它在控制台上工作,我也会将文本打印到控制台,只是不能将它附加到我的文本区域。。。 这是我的密码: Toolbar.java import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.a

如果我按下一个按钮,我只是尝试将一个文本附加到一个文本区域。我将其分开,因此textArea在另一个名为TextPanel的类中创建。有趣的是,如果我按下那个按钮,它在控制台上工作,我也会将文本打印到控制台,只是不能将它附加到我的文本区域。。。 这是我的密码:

Toolbar.java

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Toolbar extends JPanel implements ActionListener{

    private JButton helloButton;
    private JButton goodbyeButton;
    private TextPanel textPanel;

    public Toolbar() {

        helloButton = new JButton("Hello!");
        goodbyeButton = new JButton("Goodbye!");
        textPanel = new TextPanel();

        helloButton.addActionListener(this);
        goodbyeButton.addActionListener(this);

        setLayout(new FlowLayout(FlowLayout.LEFT));

        add(helloButton);
        add(goodbyeButton);
    }

    public void actionPerformed(ActionEvent e) {

        JButton clicked = (JButton)e.getSource();

        if (clicked == helloButton) {
            textPanel.appendText("Hello!\n");
            System.out.println("Hello!\n");
        }
        else if (clicked == goodbyeButton) {
            textPanel.appendText("Goodbye!\n");
            System.out.println("Goodbye!\n");
        }
    }
    /*
    public void setTextPanel(TextPanel textPanel) {
        this.textPanel = textPanel;
    }
    */
}


TextPanel.java

import java.awt.BorderLayout;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class TextPanel extends JPanel{

    private JTextArea textArea;

    public TextPanel() {

        textArea = new JTextArea();
        setLayout(new BorderLayout());
        add(new JScrollPane(textArea), BorderLayout.CENTER);
    }

    public void appendText(String text) {
        textArea.append(text);
    }
}

MainFrame.java

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JToolBar;

public class MainFrame extends JFrame{

    private JButton btn;
    private TextPanel textPanel;
    private Toolbar toolbar; 

    public MainFrame() {

        super("My First JAVA Swing Window");
        setLayout(new BorderLayout());

        textPanel = new TextPanel();
        toolbar = new Toolbar();

        add(textPanel, BorderLayout.CENTER);
        add(toolbar, BorderLayout.NORTH);

        setSize(600,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

}
App.java

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class App {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainFrame();
            }
        });

    }

}


您需要使用
add(textPanel)添加textPanel对象


由于添加了主类代码而扩展了答案:
从工具栏类中删除
textPanel=newtextpanel()
,取消对
setTextPanel
方法的注释,并在使用
Toolbar=newtoolbar()创建工具栏后调用
Toolbar.setTextPanel(textPanel)

问题是您正在创建两个textPanel实例,只修改了一个未添加到框架中的实例。

您是否尝试将初始大小设置为
JTextArea

你可以试试和


@在这种情况下,可能问题在于你正在制作两个不同的文本面板,并在一个没有添加到框架中的面板上调用
appendText
?现在它可以工作了!谢谢实际上,我从一个教程中复制了setTextPanel方法,它看起来只是为了解决这个问题,但我真的不明白它是如何解决的。。。你能给我解释一下吗?没问题,很高兴它起作用了!每次运行
newtextpanel()
时,它都会创建一个类的新实例。创建两个实例时,它们彼此独立,因此对其中一个实例调用
textappen
不会影响另一个实例。在一个类中创建实例时,如果要在另一个类中更改实例,则必须将其作为方法的参数在类之间传递-这就是
setTextPanel
所做的。您所做的是告诉
工具栏
类使用您在
大型机
中创建的同一实例,因此您所做的更改将在两个类中影响它,因为它是同一实例。
public TextPanel() {

    textArea = new JTextArea();

    textArea.setRows(10);
    textArea.setColumns(10);

    setLayout(new BorderLayout());
    add(new JScrollPane(textArea), BorderLayout.CENTER);
}