【问题标题】:JComponents not displaying in JFrameJComponents 不在 JFrame 中显示
【发布时间】:2014-07-15 21:53:06
【问题描述】:

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

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?我只想让我的组件显示...

【问题讨论】:

  • 我可能是错的,但您可能想尝试将面板添加到框架的 contentPanel 而不是直接添加到框架(虽然我还没有实际测试过,所以我不确定它是否将解决您的问题)
  • 没关系:JFrame#add() 转发到内容窗格。为什么不CardLayout

标签: java swing


【解决方案1】:

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

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

【讨论】:

  • 布局管理器可能是罪魁祸首,因为JFrame 的默认布局是BorderLayoutFlowLayoutJPanel。但是,如果您希望在任务运行时使用其中一个组件作为掩码来阻止输入到框架中,那么我建议您改用 JFrame 的玻璃窗格组件,尤其是在您有很多控件的情况下在你的 JFrame 中。
  • 如果我想覆盖 getPreferredSize 方法的主体,我会使用什么类型的代码?我的组件覆盖的唯一方法是 paintComponent 方法。
  • @jgibson 或 JLayeredPane 或 OverlayLayout,取决于需要什么
  • @user2154420 您将返回组件的“首选”大小,假设所有其他因素都相同...
  • 哦,哇。非常感谢!最后一个快速的问题:有没有办法让面板中的一个组件“固定”,或者当框架改变大小时,一个组件在其部分中保持“居中”,或者说滚动条水平移动框架?目前,第一个组件保持固定,而另一个组件随着窗口大小的变化而移动(并且可以在另一个组件之上移动)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多