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 教程部分。
我正在尝试在 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 教程部分。