简单地说,有一个简单的Java Swing应用程序,其中包括一些组件的JFrame。其中一个组件是一个JPanel,旨在在用户操作时被另一个JPanel替换。
那么,正确的做法是什么?我已经尝试过:
panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();
但这种方法行不通,你有什么建议吗?
简单地说,有一个简单的Java Swing应用程序,其中包括一些组件的JFrame。其中一个组件是一个JPanel,旨在在用户操作时被另一个JPanel替换。
那么,正确的做法是什么?我已经尝试过:
panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();
但这种方法行不通,你有什么建议吗?
1)设置第一个面板:
JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());
2)更换面板:
frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());
还要注意必须在事件线程中执行此操作,为确保这一点,请使用SwingUtilities.invokeLater或SwingWorker
frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.
请记住,Java 使用“按值传递副本引用”的参数传递方式。因此,更改一个变量不会更改传递给其他方法的引用的副本。
另外,请注意JFrame
的名称在可用性方面非常令人困惑。添加组件或设置布局(通常)会对内容窗格执行操作。令人奇怪的是,获取布局实际上确实会给您框架的布局管理器。
public class PanelTest extends JFrame {
Container contentPane;
public PanelTest() {
super("Changing JPanel inside a JFrame");
contentPane=getContentPane();
}
public void createChangePanel() {
contentPane.removeAll();
JPanel newPanel=new JPanel();
contentPane.add(newPanel);
System.out.println("new panel created");//for debugging purposes
validate();
setVisible(true);
}
}
关于用户操作:
// 你需要做一些类似以下的事情
myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()
myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()
Game game = new Game();
getContentPane().removeAll();
setContentPane(game);
getContentPane().revalidate(); //IMPORTANT
getContentPane().repaint(); //IMPORTANT
我也遇到了完全相同的问题!不可思议!!我找到的解决方案是:
// Hiding all components (JPanels) added to a container (ex: another JPanel)
for (Component component : this.container.getComponents()) {
component.setVisible(false);
}
// Showing only the selected JPanel, the one user wants to see
panel.setVisible(true);
不需要revalidate()、validate()或CardLayout。
layout.replace() 方法只适用于 GroupLayout 管理器。
其他布局管理器(如CardLayout、BoxLayout等)不支持此功能,但需要您首先调用RemoveLayoutComponent()方法,然后再调用AddLayoutComponent()方法。 :-) [仅纠正记录]