【问题标题】:Why isn't my Java GUI GridBagLayout putting my JPanel Grid in the middle of the frame?为什么我的 Java GUI GridBagLayout 没有将我的 JPanel Grid 放在框架的中间?
【发布时间】:2014-10-22 15:12:48
【问题描述】:

我创建了一个网格,扩展了 JPanel 覆盖图形,我添加了一个 JPanel,它是一个 GridBagLayout 并将 JPanel 添加到 JFrame。但只有部分网格显示出来,其余全部隐藏在网格的右下角和左上角,接触 JPanel 的中间。

JFrame 的:setSize(500, 300);

JPanel 的:setSize(250, 250);

一直在想办法,但无法...请帮忙。

编辑:下面是代码

public class Start extends JFrame{
 public Start(){
  setSize(500, 300);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JPanel jp = new JPanel(new GridBagLayout());
  jp.add(grid);
  add(jp, BorderLayout.CENTER);
  setVisible(true);
 }
}

//main method calling new Start();

public class DrawGrid extends JPanel{
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        setSize(250, 250); 
        Graphics2D g2 = (Graphics2D) g;
        //Grid algorithm here 20 x 20
    }

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应。也看看Laying Out Components Within a Container。 Swing 组件通过 preferred/minimum/maximumSize 属性向布局管理器提供大小提示
  • 是的,请提供完整的示例或更大的代码 sn-p
  • 没有更多代码很难说,但我猜这就是您初始化 GridBagLayout 的方式。
  • @MadProgrammer 编辑
  • 请考虑提供网格代码

标签: java user-interface grid


【解决方案1】:

永远不要从绘制方法中更改任何 UI 组件的状态,这可能会导致组件无效并引发一个或多个重绘请求,从而导致绘制请求的无限循环,从而导致您的 PC内爆……好吧,至少它最终会消耗你的 CPU……

您的DrawGrid 没有为布局管理器定义首选/最小/最大尺寸提示。

使用setSize 不会做任何事情,因为它将被布局管理器覆盖

相反,覆盖组件的getPreferredSize 方法并将“首选”大小返回给布局管理器

public class DrawGrid extends JPanel{

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(250, 250);
    }

    @Override
    protected void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        //Grid algorithm here 20 x 20
    }

注意,尺寸提示只是,它们是提示,布局管理器可以自行决定忽略其中的一个或多个...

详情请见Laying Out Components Within a Container

【讨论】:

  • 谢谢!!可以,但是getPreferredSize()前面的Dimension代表什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多