java - 下边框不可见

标签 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。就我而言,首选高度大于空间,因此我看不到按钮的下边框。

您对选择哪种布局有什么建议吗?我想要按钮的首选宽度,但父组件的高度。

最佳答案

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

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

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

这应该可以解决问题。您还可以向该面板添加任意数量的按钮,它们将始终缩放以适合面板。

编辑

要将内容彼此相邻放置,您可以使用 GridBagLayout 和经过调整的 GridBagConstraint。以下代码可以为您完成此操作:

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);

关于java - 下边框不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34119376/

相关文章:

java - 如何更改 JEditorPane 中 HTML 文档的特定元素的颜色?

java - 通过单击特定图像获取有关特定对象的信息

java - 在框架上启动键绑定(bind)

css - 如何强制CSS边框显示在分层页面上?

java - 在字典中的单个键下保存多个值

java - 如何让模拟方法为任何参数返回不同的值(从数组)?

java - 导出的 JAR 无法读取图像

html - 只有底部边框的输入文本字段

css - `border-style: double`如何拆分像素?

java - 计算字符串中的空格数