【发布时间】: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