【问题标题】:JButton in separate class won't change JTextField(Area) text in different class单独类中的 JButton 不会更改不同类中的 JTextField(Area) 文本
【发布时间】:2025-12-06 08:00:02
【问题描述】:

我有一个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 listener)。好的,这是按钮侦听器类的部分代码 代码:

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

我该怎么办?

【问题讨论】:

    标签: java jframe jpanel jbutton


    【解决方案1】:

    问题是您在错误的对象上调用了 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();
        }
    }
    

    【讨论】: