JFrame/JPanel 刷新和文本字段

JFrame/JPanel refreshing and text fields

我正在尝试在 JFrame 的 BorderLayout.CENTER 中切换显示不同的 JPanel。每个 JPanel 都包含一个 JTextField 和一个 JTextPane。在 JFrame 上调用 revalidate()repaint(),我得到了一个非常奇怪的结果:我第一次通过单击 secondButton 切换到 secondPanel 时,一切都按预期进行。然后,当我尝试使用 firstButton 切换回来时,没有任何反应。它只会在我再次单击 secondButton 时切换回来,然后它会按预期工作,除了反向:单击 firstButton 显示 secondPanel 并单击 secondButton 显示 firstPanel.

在要显示的 JPanel 上调用 revalidate()repaint(),一切正常,直到我单击任一文本区域。每次点击,它就像文本的一部分 "falls off" 就像它只是一个门面,显示下面另一个 JPanel 的相应区域的文本。如果我键入某些内容,文本会立即更改为另一个 JPanel 的文本,并且即使在切换 JPanel 之后,我键入的内容也会添加到其中。真的很奇怪,很难形容,大家自己看吧。

我有三个问题:1.到底是怎么回事,2.为什么会这样,3.我该如何解决?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyFrame extends JFrame {

    class MyActionListener implements ActionListener {
        JPanel panel;
        MyActionListener(JPanel _panel) {
            panel = _panel;
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
            MyFrame.this.add(panel, BorderLayout.CENTER);
            //MyFrame.this.revalidate();
            //MyFrame.this.repaint();
            panel.revalidate();
            panel.repaint();
        }
    }

    JPanel buttonPanel = new JPanel();

    JButton firstButton = new JButton("first");
    JPanel firstPanel = new JPanel();
    JTextPane firstPane = new JTextPane();
    JTextField firstField = new JTextField("first field");

    JButton secondButton = new JButton("second");
    JPanel secondPanel = new JPanel();
    JTextPane secondPane = new JTextPane();
    JTextField secondField = new JTextField("second field");

    MyFrame() {
        firstPane.setText("first pane");
        firstPanel.setLayout(new BorderLayout());
        firstPanel.add(firstPane, BorderLayout.CENTER);
        firstPanel.add(firstField, BorderLayout.SOUTH);
        firstButton.addActionListener(new MyActionListener(firstPanel));

        secondPane.setText("second pane");
        secondPanel.setLayout(new BorderLayout());
        secondPanel.add(secondPane, BorderLayout.CENTER);
        secondPanel.add(secondField, BorderLayout.SOUTH);
        secondButton.addActionListener(new MyActionListener(secondPanel));

        buttonPanel.setLayout(new GridLayout(0,1));
        buttonPanel.add(firstButton);
        buttonPanel.add(secondButton);

        add(buttonPanel, BorderLayout.WEST);
        add(firstPanel, BorderLayout.CENTER);

        setSize(new Dimension(300,300));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MyFrame();
    }
}

how do I fix it?

使用 CardLayout。有关详细信息和示例,请参阅 How to Use CardLayout 上的 Swing 教程部分。