当前位置: 首页 > 知识库问答 >
问题:

Java Swing GridBagLayout:可以创建不同列数的行吗?

和选
2023-03-14

我是JavaSwing的新手,我必须编写一个如下所示的接口:

它是一个复选框,后跟一个文本字段,然后是一个按钮。不要介意虚线,我添加它们只是为了使“网格”可见,我知道我可以制作一个组件并为复选框、文本和按钮重用,这样布局就简单多了。我只是想了解GridbagLayout的怪癖。

基本上,第一行应该有2列,第二行和第三行应该有6列。为此,我尝试使用GridBagLayout,但结果不是预期的,我不确定我是否遗漏了什么,或者如果没有内部面板就不可能做到这一点。这是我的课:

import javax.swing.*;
import java.awt.*;

public class GridBagLayoutTest extends JFrame {

    JPanel panel = new JPanel();

    public GridBagLayoutTest(){

        setTitle("Grid Bag Layout Test");
        GridBagLayout layout = new GridBagLayout();
        panel.setLayout(layout);
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());

        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx=1; // set to use all horizontal space available
        gbc.weighty=0;

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(2,2,2,2);

        // Labels line. Each label should be 50%
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        panel.add(new JLabel("Label 2"), gbc);

        // Checkbox left group. The three components should take 50% of the total width
        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 2;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);

        // Checkbox right group. The three components should take 50% of the total width
        gbc.gridx = 3;
        gbc.gridy = 1;
        panel.add(new JCheckBox("Ind 1"), gbc);

        gbc.gridx = 4;
        gbc.gridy = 1;
        panel.add(new JTextField(), gbc);

        gbc.gridx = 5;
        gbc.gridy = 1;
        panel.add(new JButton("..."), gbc);


        setContentPane(panel);
        this.setSize(800,200 );
        setPreferredSize(getSize());
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

如果没有内部面板就可以实现这一点,那么我的代码中缺少了什么?

共有1个答案

谢骏奇
2023-03-14
    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);

第二个标签应从第3列开始:

    gbc.gridx = 0;
    gbc.gridy = 0;
    panel.add(new JLabel("Label 1"), gbc);

    gbc.gridx = 3; // changed
    gbc.gridy = 0;
    panel.add(new JLabel("Label 2"), gbc);
 类似资料:
  • 问题内容: 标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我要做的就是调用getInstance或inject?我当时在看辅助注射,但这似乎是另外一个话题:https : //code.google.com/p/google- guice/wiki/AssistedInject 问题答案: 听起来您正在寻找,这是多重绑定功能的一部分。请注意,您仍然需要放入某种工厂接口或其他工厂接

  • 标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我所做的只是调用 getInstance 或注入?我正在研究辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject

  • null null 这将创建2行,第一行高度为100px,第二行高度为。第二行中的2列具有宽度。 是否可以通过CSS网格/FlexBox将第2行的2列水平居中?即。每行的列数不同。 我正试图解决浏览器中CSS网格框架的一个琐碎的使用问题。如果使用FlexBox构建网格,这是很容易实现的。 但是我能用CSS网格实现它吗? 这里是一个我试图实现的代码本演示。

  • 我可以创建一个协议在不同的主机名上运行吗?我一直在使用协议规则,并保持主机名为localhost。但现在我正在尝试为一个不能在localhost上运行的应用程序创建一个协议。 @rule public PactProviderRule provider=new PactProviderRule(“ServiceNowClientrestClientProvider”,“localhost”,808

  • 我试图计算一个折扣,我想应用到我的数据帧的两列中的每一行,并将结果添加到一个新列中。 我已经尝试了很多方法,通过遵循现有的例子,但是每次都发生错误。 我将函数定义为: 然后尝试将该函数应用于我的数据框 我希望有一个新的列,其中每一行都是应用于ordini[“revenue1”]和ordini[“revenue2”]的函数的结果。 但我得到了以下错误: ValueError:序列的真值不明确。使用a

  • 我想创建一个包含XFA数据的PDF,但我不想在查看PDF时看到XFA数据,但是,我希望可以通过以下代码访问它: 我怎么能这样呢? 谢谢