简单来说,有一个简单的java swing应用程序,它由JFrame和其中的一些组件组成.其中一个组件是JPanel,它意味着在用户操作上被另一个JPanel替换.
那么,做这样事情的正确方法是什么?我试过了
panel = new CustomJPanelWithComponentsOnIt(); parentFrameJPanelBelongsTo.pack();
但这不行.你会建议什么?
您的用例,对于CardLayout来说似乎很完美.
在卡片布局中,您可以在同一位置添加多个面板,然后一次显示或隐藏一个面板.
1)设置第一个面板:
JFrame frame=new JFrame(); frame.getContentPane().add(new JPanel());
2)更换面板:
frame.getContentPane().removeAll(); frame.getContentPane().add(new JPanel());
另请注意,您必须在Event的Thread中执行此操作,以确保使用SwingUtilities.invokeLater或SwingWorker
frame.setContentPane(newContents()); frame.revalidate(); // frame.pack() if you want to resize.
请记住,Java使用'按值复制引用'参数传递.因此,更改变量不会更改传递给其他方法的引用的副本.
另外请注意JFrame
,在可用性的名称中非常混乱.添加组件或设置布局(通常)会在内容窗格上执行操作.奇怪的是,获得布局确实给你框架的布局管理器.
希望这段代码能让您了解如何在JFrame中更改jPanel.
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()
然后你可以根据需要调整你的wndow.