GridBagLayout内容未与JPanel

时间:2015-07-01 01:55:50

标签: java swing layout-manager gridbaglayout

我有一个JFrame(BorderLayout)在南方位置持有JPanel(GridBagLayout)。 JPanel边框水平填充屏幕(我想要它),内容中的内容也是如此(我不想要)。

可视化更容易,所以我在Photoshop中做了我在Java中无法理解的内容......

我在photoshop中做了这个,以展示我想要发生的事情: Desired Layout 这是我的代码产生的: What I Get

以下是我使用的代码:

private void loadTags(String filePath)
{
    Map<String, ArrayList<String>> fileTags;

    try
    {
        fileTags = PowerPointManipulator.getTagsFromFile(filePath);
    }
    catch (IOException e)
    {
        System.err.println("Could not open Powerpoint File");
        e.printStackTrace();
        return;
    }

    tag_listener = new TagButtonListener();

    pnl_tags = new JPanel();
    pnl_tags.setBackground(new Color(0, 0, 0, 0));
    pnl_tags.setLayout(new GridBagLayout());
    pnl_tags.setAlignmentX(LEFT_ALIGNMENT);

    brd_tags = new TitledBorder("Tags");
    brd_tags.setTitleColor(Color.WHITE);
    brd_tags.setBorder(new LineBorder(Color.WHITE));
    pnl_tags.setBorder(brd_tags);

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.insets = new Insets(0, 0, 2, 15);
    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
    int col = 0;

    for (String key : fileTags.keySet())
    {
        ArrayList<String> vals = fileTags.get(key);
        gbc.gridwidth = 2;
        gbc.gridx = col;
        gbc.gridy = 0;

        JToggleButton tempButton = new JToggleButton(key);
        tempButton.setOpaque(false);
        tempButton.addActionListener(tag_listener);
        tempButton.setFocusable(false);

        pnl_tags.add(tempButton, gbc);

        int row = 1;

        for (String val : vals)
        {
            tempButton = new JToggleButton(val);
            tempButton.setOpaque(false);
            tempButton.addActionListener(tag_listener);
            tempButton.setFocusable(false);

            gbc.gridwidth = 1;
            gbc.gridy = row;
            pnl_tags.add(tempButton, gbc);

            row++;
        }

        col += 2;
    }

    contentPane.add(pnl_tags, BorderLayout.PAGE_END);
}

如果我删除&#34;体重&#34;选项,然后我得到正确的布局,除了按钮在JPanel中居中。

我觉得我很近,但我无法获得正确的设置!非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

GridBagConstraints#weightxGridBagConstraints#weighty会导致组件占用所有其他组件布局后剩余的剩余空间,GridBagConstraints#fill将导致组件填充可用空间根据您提供的值,它所驻留的单元格,

gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 1.0;

正在按照你的要求行事。

您可以尝试类似......

List<String> tags = new ArrayList<>(25);
tags.add("example");
tags.add("objective");
tags.add("motivation");
tags.add("summary");
tags.add("c");
tags.add("*");
tags.add("*");
tags.add("*");
tags.add("cs");

JPanel tagPane = new JPanel(new GridBagLayout());
tagPane.setBorder(new TitledBorder("Tags"));

GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
for (String tag : tags) {

    tagPane.add(new JToggleButton(tag), gbc);
    gbc.gridx--;
    if (gbc.gridx < 0) {
        gbc.gridx = 3;
        gbc.gridy++;
    }

}

这导致类似......

Almost

好的,这样更好一点,但它们被分组在中心!

好吧,您可以设置它,以便每个右侧列都有weightx 1,例如......

gbc.gridx--;
if (gbc.gridx < 0) {
    gbc.gridx = 3;
    gbc.gridy++;
    gbc.weightx = 1;
} else {
    gbc.weightx = 0;
}

或者在所有其他组件的右侧添加“填充”组件......

for (String tag : tags) {

    tagPane.add(new JToggleButton(tag), gbc);
    gbc.gridx--;
    if (gbc.gridx < 0) {
        gbc.gridx = 3;
        gbc.gridy++;
    }

}
JLabel filler = new JLabel();
gbc.gridx = 4;
gbc.gridy = 0;
gbc.weightx = 1;
tagPane.add(filler, gbc);

无论哪种方式,你最终会得到类似......

Done

仔细查看How to Use GridBagLayout了解更多详情