我有两个版本的代码,不明白为什么它们看起来不一样:
版本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的首选宽度,但需要父组件的高度。
答案 0 :(得分:2)
对于你想要的(我猜)你应该使用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);