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

时间:2018-04-10 09:46:18

标签: java jframe jpanel jbutton

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

第二个JPanelJTextArea

第三个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更改。它只是不会写入窗口或从窗口读取..

我该怎么办?

1 个答案:

答案 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();
    }
}