Java JFrame中未显示的JComponents

Java JFrame中未显示的JComponents,java,swing,Java,Swing,以下是我在主类中的一段代码: JFrame frame = new JFrame(); JPanel panel = new JPanel(); GPComponent gp = new GPComponent(n, k); GPinfinityComponent gpi = new GPinfinityComponent(n, k); panel.add(gp); panel.add(gpi); frame.add(panel, BorderLayout.CENTER); // just

以下是我在主类中的一段代码:

JFrame frame = new JFrame();
JPanel panel = new JPanel();

GPComponent gp = new GPComponent(n, k);
GPinfinityComponent gpi = new GPinfinityComponent(n, k);

panel.add(gp);
panel.add(gpi);

frame.add(panel, BorderLayout.CENTER); // just to be clear
frame.setVisible(true);
final int FRAME_WIDTH = 600;
final int FRAME_HEIGHT = 600;
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setTitle("GP("+n+", "+k+")");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

GPComponent和GPinfinityComponent的详细信息是不必要的。。。它们扩展了JComponent,当我将它们单独放入框架中(不使用面板)时,它们工作得很好。但是,我希望使用JPanel将一个显示在另一个上,这样我就不必运行程序来完成相同的任务。每个JComponents将在以后使用自定义方法单独更新。。。在我尝试将它们结合起来之前,这些都是有效的。本质上,我的问题是,我是否正确地设置了将JComponents添加到JPanel,然后将其添加到JFrame?我只想让我的组件显示…

无需进一步证明,您的两个自定义组件可能没有覆盖
getPreferredSize
方法(或者没有使用生成此值的适当布局管理器),这意味着
FlowLayout
,这是
JPanel
的默认布局管理器,它们的大小自动调整为
0x0


另一个测试是在框架上调用
pack
,这将尝试将框架打包为其内容首选大小

我可能错了,但您可能希望尝试将面板添加到框架的
contentPanel
,而不是直接添加到框架中(虽然我还没有实际测试过,所以我不确定它是否能解决您的问题)这应该没关系:
JFrame#add()
转发到内容窗格。为什么不
CardLayout
?布局管理器可能是罪魁祸首,因为
JFrame
的默认布局是
BorderLayout
JPanel
FlowLayout
。但是,如果您希望使用其中一个组件作为掩码来阻止输入到当任务运行时,我建议使用JFrame的glass pane组件,尤其是在JFrame中有许多控件的情况下。如果要重写getPreferredSize方法,我会在getPreferredSize方法体中使用哪种类型的代码?我的组件重写的唯一方法是paintComponent方法。@jgibson或JLayeredPane或OverlayLayout,具体取决于required@user2154420假设所有其他因素都相等,您将返回您想要的组件的“首选”大小…哦,哇。非常感谢!最后一个快速问题:是否有办法使面板中的一个组件“固定”,或使一个组件保持“居中”当框架改变大小时,或者说滚动条水平移动fram时,第一个组件保持固定,另一个组件随着窗口大小的改变而移动(并且可以在另一个组件上移动)。