如何在JPanel中保持对齐摆动组件

时间:2016-03-20 09:42:57

标签: java swing layout-manager gridbaglayout

我有以下摆动组件。请看图像。 这里标签和组合框和标签以及文本字段没有正确对齐。知道是什么导致了这个问题吗?

The category Label and combo box are not aligned properly

我在面板中使用GridBagLayout。然后将标签,组合框和文本字段等组件添加到面板中。

以下是我使用的代码。

    srchCategoryLbl = new JLabel("Category");
    categoryCmb = new JComboBox<>();
    categoryCmb.setPreferredSize(dimensionTxt);
    categoryCmb.setBounds(0, 0, 0, 0);

    srchProductCodeLbl = new JLabel("Product Code");
    productCodeTxt = new JTextField();
    productCodeTxt.setPreferredSize(dimensionTxt);

    srchProductDescLbl = new JLabel("Product Desc");
    productDescTxt = new JTextField();
    productDescTxt.setPreferredSize(dimensionTxt);

    searchBtn = new JButton("Search");

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.anchor = GridBagConstraints.WEST;
    searchPanel.add(srchCategoryLbl, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    searchPanel.add(categoryCmb, gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    searchPanel.add(srchProductCodeLbl, gbc);

    gbc.gridx = 1;
    gbc.gridy = 1;
    searchPanel.add(productCodeTxt, gbc);

    gbc.gridx = 2;
    gbc.gridy = 0;
    searchPanel.add(srchProductDescLbl, gbc);

    gbc.gridx = 2;
    gbc.gridy = 1;
    searchPanel.add(productDescTxt, gbc);

    gbc.gridx = 3;
    gbc.gridy = 1;
    searchPanel.add(searchBtn, gbc);

1 个答案:

答案 0 :(得分:2)

当您选择其中一个字段时,您可以看到MacOS放置一个&#34;焦点&#34;字段周围的矩形,这是通过使用某种自定义Border来实现的。

Fields

您可以将边框设置为null(或其他内容),但这可能会以意想不到的方式影响其他外观,并会以他们可能不欣赏的方式改变用户体验

更好的解决方案是使用GridBagConstraints#insets属性来填充标签......

Some Padding

JLabel srchCategoryLbl = new JLabel("Category");
JComboBox<Object> categoryCmb = new JComboBox<>();
categoryCmb.setPrototypeDisplayValue("This is a really long test string");

JLabel srchProductCodeLbl = new JLabel("Product Code");
JTextField productCodeTxt = new JTextField(20);

JLabel srchProductDescLbl = new JLabel("Product Desc");
JTextField productDescTxt = new JTextField(20);

JButton searchBtn = new JButton("Search");

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
Insets labelInsets = new Insets(0, 4, 0, 4);
Insets fieldInsets = new Insets(0, 0, 0, 0);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = labelInsets;
add(srchCategoryLbl, gbc);

gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = fieldInsets;
add(categoryCmb, gbc);

gbc.gridx = 1;
gbc.gridy = 0;
gbc.insets = labelInsets;
add(srchProductCodeLbl, gbc);

gbc.gridx = 1;
gbc.gridy = 1;
gbc.insets = fieldInsets;
add(productCodeTxt, gbc);

gbc.gridx = 2;
gbc.gridy = 0;
gbc.insets = labelInsets;
add(srchProductDescLbl, gbc);

gbc.gridx = 2;
gbc.gridy = 1;
gbc.insets = fieldInsets;
add(productDescTxt, gbc);

gbc.gridx = 3;
gbc.gridy = 1;
add(searchBtn, gbc);

同样,这是跨平台UI的一个不幸问题之一,因为您需要设计一种方法,根据当前平台,您可以根据这种方法确定需要多少插入内容。 / p>

我还强烈建议您避免使用setPreferredSize,因为在计算组件的适当大小时会考虑很多,而是使用已经可用的功能(例如setColumns上的JTextField,请参阅上面的代码了解一些示例