【问题标题】:Swing not rendering my JPanels properly [closed]Swing 无法正确渲染我的 JPanel [关闭]
【发布时间】:2014-12-23 11:31:42
【问题描述】:
public void renderPanels(){
    for(int i = 1; i<4; i++){
        for(int j = 1; j<4; j++){
            panels[i][j] = new JPanel();
            frame.add(panels[i][j]);

            buttons[i][j] = new JButton();
            panels[i][j].add(buttons[i][j]);

            panels[i][j].setBounds(i*50, j*50, 50, 50);

            panels[i][j].setLayout(null);

            buttons[i][j].setBounds(0, 0, 50, 50);

            System.out.println(panels[i][j].getBounds());
        }
    }
}

好的,这是我的代码,用于渲染一个 3x3 的面板网格,其中包含按钮。 frame 变量包含一个JFrame 对象,但遗憾的是我的输出如下图所示:

最后一次迭代中的帧似乎被渲染在一个位置,好像 i 和 j 比初始值低 1 个单位。有什么想法吗?

【问题讨论】:

  • 请使用布局管理器而不是调用setBounds
  • CardLayout 呢?
  • 我的问题是为什么这不起作用?
  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 3) 很可能空布局是所见问题的根源。
  • 出现的那个 GUI 的部分,向我建议 GridLayout..

标签: java swing loops jpanel rendering


【解决方案1】:
  1. 使用GridLayout而不是setBounds(),根本不要使用NullLayout

  2. frame.add(panels[i][j]); 应该是循环中的最后一行代码

  3. System.out.println(panels[i][j].getBounds()); 在调用JFrame.pack()JFrame 已经在屏幕上是visible 后返回合理的坐标

  4. 为了获得更好的帮助,请尽快发布 SSCCE/MCVE,简短、可运行、可编译

【讨论】:

    【解决方案2】:

    这是因为JFrame 默认布局不是null。这是一个BorderLayout。 如果您真的想设置边界,请制作JFrame 布局null

    frame.setLayout(null);
    

    ** 虽然可以不使用布局管理器,但您应该尽可能使用布局管理器。布局管理器可以更轻松地适应依赖外观的组件外观、不同的字体大小、容器的不断变化的大小以及不同的语言环境。布局管理器也可以很容易地被其他容器以及其他程序重用。

    虽然,GridLayout 是要走的路。 以下是您可能需要考虑的一些事项。

    Absolute Positioning

    How to use GridLayout

    这里是一些基本的 GridLayout

      JPanel m = new JPanel();
    
            GridLayout gridLayout = new GridLayout(3, 3,0,0);
            m.setLayout( gridLayout);
            for (int i = 0; i < gridLayout.getRows(); i++) {
                for (int ii = 0; ii < gridLayout.getColumns(); ii++) {
                    JPanel p = new JPanel();
                    p.add(new JButton("X"));
                    m.add(p, i, ii);
                }
    
            }
            frame.add(m);
    

    【讨论】:

    • 抱歉,我不能在这种情况下支持 null 布局。
    • @trashgod 他特别说“我的问题是为什么这不起作用?”在评论中。我也知道更好的方法是使用GridLayout,但我只是给出了答案。
    • 您关于默认布局的说法是正确的; JPanel的默认布局是FlowLayout;在调用 pack() 或调整封闭窗口大小之前,两者都是不相关的;至于为什么这不起作用,请注意海报的索引是如何以1 开头的;不是你的反对者。
    • @trashgod ,“不是你的反对者。”是的,我知道。谢谢你。顺便说一句,如果你想改进这个答案,请成为我的客人。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2015-03-10
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多