我有一个包含 3 个JPanels
的JFrame
(每个都在一个单独的类中)。第一个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();
}
}