下边框不可见

时间:2015-12-06 15:52:48

标签: java swing border

我有两个版本的代码,不明白为什么它们看起来不一样:

版本1:

urlButton = new JButton("URL");
borderLayout.add(urlButton, BorderLayout.LINE_END);

版本2:

JPanel rightPanel = new JPanel();
rightPanel.setLayout(new FlowLayout(0, 0, 0));
urlButton = new JButton("URL");
rightPanel.add(urlButton);
borderLayout.add(rightPanel, BorderLayout.LINE_END);

在版本2中,无法看到urlButton的下边框。我怎样才能解决这个问题?我需要版本2,因为我想向rightPanel添加更多元素。

编辑:我认为边境确实不存在。它不再可见了。我想使用FlowLayout有一些额外的填充或边距会使我的JButton像素移动得更低,这样边框就会被另一个组件覆盖。但是我不知道在哪里寻找这样的额外填充/边距以将其设置为0。

编辑2:我创建了一个MCVE并立即查看问题。

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MCVE extends JFrame {

    private MCVE(boolean missingBorder) {
        super(String.format("MCVE (missingBorder: %b)", missingBorder));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new BorderLayout());
        add(new JButton("MIDDLE"));
        add(new JButton("LOWER"), BorderLayout.PAGE_END);

        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new FlowLayout(0, 0, 0));

        JButton urlButton = new JButton("URL");

        if (missingBorder) {
            rightPanel.add(urlButton);
            add(rightPanel, BorderLayout.LINE_END);
        } else {
            add(urlButton, BorderLayout.LINE_END);
        }

        setSize(500, 88);
        setVisible(true);

    }

    public static void main(String[] args) {
        new MCVE(true);
        new MCVE(false);
    }

}

我无意识地期望FlowLayout调整JButton的高度。但是,FlowLayout当然会以JButton的首选大小显示。在我的情况下,首选高度比空间大,所以我看不到按钮的下边框。

您是否有任何建议选择布局?我想要Button的首选宽度,但需要父组件的高度。

1 个答案:

答案 0 :(得分:2)

对于你想要的(我猜)你应该使用GridLayout。交换行

rightPanel.setLayout(new FlowLayout(0, 0, 0));

rightPanel.setLayout(new GridLayout(0, 1));

应该做的伎俩。您还可以根据需要为该面板添加任意数量的按钮,它们将始终缩放以适合面板。

修改

要将内容放在彼此旁边,您可以使用GridBagLayoutGridBagConstraint。以下代码适合您:

rightPanel.setLayout(new GridBagLayout());
GridBagConstraints constraint = new GridBagConstraints();
constraint.weighty = 1.0;
constraint.fill = GridBagConstraints.BOTH;

并添加您的组件

rightPanel.add(urlButton, constraint);
rightPanel.add(checkbox, constraint);

如果您不想使用复杂的GridBagConstraints,则可以使用BorderLayout即兴创作最多3个组件。然后,您可以使用以下方式添加按钮和复选框:

rightPanel.add(urlButton, BorderLayout.WEST);
rightPanel.add(checkbox, BorderLayout.EAST);