【问题标题】:Starting GridBagLayout from top left corner in Java Swing在 Java Swing 中从左上角开始 GridBagLayout
【发布时间】:2011-09-15 21:30:36
【问题描述】:

我是 Java Swing 的新手,我一直在努力从左上角启动 GridBagLayout,以便 c.gridx=0 c.gridy=0 将我的对象放在左上角。

如果您能告诉我在此之后我需要做什么,我将不胜感激:

    JPanel panel = new JPanel(new GridBagLayout());
    frame.add(panel);
    GridBagConstraints c = new GridBagConstraints();

我知道我必须使用 NORTHWEST 或 FIRST_LINE_START 常量,但我不知道如何使用。我试图这样做'但它没有实现常量。

    frame.getContentPane().add(panel, BorderLayout.NORTHWEST);

感谢您的帮助。

【问题讨论】:

    标签: java swing gridbaglayout


    【解决方案1】:

    您需要使用您的GridBagConstraints'anchor 属性。这应该为你做:

    frame.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.NORTHWEST;
    frame.add(panel, gbc);
    

    我不保证您不必设置约束对象的其他属性来获得您想要的布局。特别是,您可能需要将weightxweighty 设置为1,以便面板占用分配给它的所有可用空间。

    【讨论】:

    • @Emir:你可以这样做,尽管我发现将面板放在一个单独的类中而不是容纳它的框架中通常很好。如果这样做,您甚至不需要扩展 JFrame,只需将面板添加到直接的 JFrame。如果您确实使用frame.add()frame.setLayout() 等,那么所做的就是将调用委托给一个称为“内容窗格”的特殊面板。
    • @MarkPeters 可以在没有框架的情况下完成吗?我将我的 GridBagLayout 嵌入到了 DeckLayout 中,而 Frame 并不适合我。您能提供的任何帮助都会很棒。我有点累了,或者在玩 Layouts(我的问题与原始海报完全一样。)
    • @theJollySin:GridBagLayout 可以在任何 JPanel 中工作,只需使用 new GridBagLayout() 构建面板。他们如何交互可能有点棘手。如果您遇到问题,请发布一个新问题。
    【解决方案2】:

    有一个解决方法。您可以使用 BorderLayout.NORTH 将 GridBagLayout 面板放在 BorderLayout 面板中。然后 GridBagLayout 面板中的 Component 将从顶部位置开始。

    static void test4(){
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(480, 360);
    
        JPanel borderLayoutPanel=new JPanel(new BorderLayout());
        JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout());
        borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH);
        frame.add(borderLayoutPanel);
    
        JButton testButton=new JButton("test button");
        GridBagConstraints c = new GridBagConstraints();
        c.gridx=0;
        c.gridy=0;
        gridBagLayoutPanel.add(testButton, c);
    
        frame.setVisible(true);
    }
    

    【讨论】:

      【解决方案3】:

      快速简单的方法:

      在页尾添加一个空白 JLabel:

          // your code goes here
          gbc.weightx = 1;
          gbc.weighty = 1;
      
          bg.add(new JLabel(" "), gbc);  // blank JLabel
      

      【讨论】:

      • 完美运行。注意:在代码末尾使用 gbc.weightx=1 和 gbc.weighty=1 很重要,就在添加空白 JLabel 之前。因此它不会适用于所有组件,而仅适用于空白 JLabel。
      【解决方案4】:

      如果您希望网格一直到顶部,只需将所有 weighty = 0 设置为最后一项,将其设置为大于 0 的任何数字,它将有效地将其余按钮推到顶部.

      不要忘记增加按钮的网格值。

      否则会居中。 (如果您不使用 c.fill = GridBagConstraints.HORIZONTAL 属性,也可以使用 gridx 和 weightx 值来完成。)

      【讨论】:

        【解决方案5】:

        对于那些使用 IDE(例如 NetBeans)的人,我终于找到了一个不错的技巧:如果您想将组件添加到顶部并使用它们的首选尺寸:添加另一个 weighty = 1.0 的空面板。复制自自动生成的代码 (NetBeans):

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.weighty = 1.0;
        jPanelOptions.add(jPanelFiller, gridBagConstraints);
        

        【讨论】:

          【解决方案6】:

          阅读 How to Use GridBagLayout 上的 Swing 教程部分。 “weightx,weighty”部分说明:

          除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件都会在其容器的中心聚集在一起。

          【讨论】:

          • 感谢您的澄清; Mark 的帖子帮助我理解了这一点。
          • 这正是我所需要的——谢谢。我不想在框架内使用面板布局玩游戏。这只是在我的 GridBagConstraints 设置中添加了一些额外的行。很棒。
          猜你喜欢
          • 2023-03-09
          • 2013-03-28
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          相关资源
          最近更新 更多