JAVA Swing:Can';t将文本附加到文本区域
如果我按下一个按钮,我只是尝试将一个文本附加到一个文本区域。我将其分开,因此textArea在另一个名为TextPanel的类中创建。有趣的是,如果我按下那个按钮,它在控制台上工作,我也会将文本打印到控制台,只是不能将它附加到我的文本区域。。。 这是我的密码: Toolbar.javaJAVA 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
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);
}