我有一个JFrame
,其中包含3个JPanels
(每个都在一个单独的类中)。第一个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(Button侦听器)。好的,这里是按钮监听器类的代码部分
代码:
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
时,程序将无法获取文本。当我在代码中手动执行它时,它不会将更改写入Window(JTextArea)上的列表。但当我System.out.print
到控制台时,它会打印更改并正确列出条目以及我所做的任何setText
更改。它只是不会写入窗口或从窗口读取..
我该怎么办?
答案 0 :(得分:0)
问题是您在错误的对象上调用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();
}
}