【问题标题】:JFrame/JPanel refreshing and text fieldsJFrame/JPanel 刷新和文本字段
【发布时间】:2015-07-03 18:28:33
【问题描述】:

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

在 JPanel 上调用 revalidate()repaint() 以代替显示,一切正常,直到我单击任一文本区域。每一次点击,都像是文字的一部分“脱落”,就像它只是一个门面一样,露出下面另一个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();
    }
}

【问题讨论】:

    标签: java jframe jpanel refresh textfield


    【解决方案1】:

    我该如何解决?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多