单独类中的 JButton 不会更改不同类中的 JTextField(Area) 文本



我有一个包含 3 个JPanelsJFrame(每个都在一个单独的类中)。第一个JPanel包含两个JTextFields,我分别在其中写入要从中读取的文件的名称和要满足的条件。这并不真正影响我的问题,所以让我们继续前进。

第二个JPanel有一个JTextArea

第三个JPanel有两个JButtons(加载、排序),它们应该加载一个条目列表,这些条目足以满足第一个JPanel的条件,然后根据某些规则(分别)重新组织它们。

问题:

好的,第一个类是JFrame类,我只是做窗口的标准外观和感觉。

第二类是第一JPanel,有两个JTextFields

我不会为此提供代码,因为第二个JPanel代码更短并且存在相同的问题,因此我想相同的解决方案将适用。

第三类包含我应该显示文本文件中某些条目的JTextArea

法典:

public class SecondPanel extends JPanel {
JPanel panel;
JTextArea lista;
public SecondPanel() {
panel = new JPanel();
list = new JTextArea("List");   
list.setPreferredSize(new Dimension(200, 150));
this.add(list);
}
}

继续,第四个类包含Jbuttons和ActionListener(按钮侦听器)。好的,这是按钮侦听器类中的部分代码 法典:

private class ButtonListener implements ActionListener {
SecondPanel secondPanel = new SecondPanel();
FirstPanel firstPanel = new FirstPanel();
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Load")) {
//calls method that loads data from the text in a firstPanel field
loadData(firstPanel.theFile.getText());
for(int i = 0; i< students.length; i++) {
if(students[i]!=null) {
// doesn't write anything tried with .setText etc.
secondPanel.list.append(students[i]+"n");
}
}
}
}
}

因此,当我键入为文件路径指定的JTextField时,程序不会获得文本。当我在代码中手动执行此操作时,它不会将更改写入窗口(JTextArea)上的列表。但是当我System.out.print控制台时,它会打印更改并正确列出条目以及我所做的任何setText更改。它只是不会在窗口写入或读取。

我该怎么办?

问题是你在错误的对象上调用了 setText 方法。 在您的侦听器类中,您将两个新面板声明为类变量,然后在它们上调用您的方法,但我认为这些面板并不是您真正想要更改的面板。

您应该首先将面板添加到 Jframe 对象中,并在 ActionListener 上引用它们。

在这里,我为您提供了一个最小的代码,当按下 JButton 时,它会修改 JTextArea。(与 JTextField 相同)

import java.awt.*;
import javax.swing.*;
public class MyJFrame extends JFrame {
SecondPanel sPanel;
public MyJFrame() {
super("main");
Container c = getContentPane();
c.setLayout(new BorderLayout());
JButton button = new JButton("load");
button.addActionListener(new LoadListener());
c.add(sPanel = new SecondPanel(), BorderLayout.NORTH);
c.add(button, BorderLayout.SOUTH);
pack();
setVisible(true);
}
class SecondPanel extends JPanel {
public JTextArea list;
public SecondPanel() {
super();
list = new JTextArea("List");
list.setPreferredSize(new Dimension(200, 150));
add(list);
}
}
class LoadListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
sPanel.list.setText("new text for the jtext area");
}
}
public static void main(String[] args) {
new MyJFrame();
}
}

最新更新