我目前正在尝试创建一组类似于 Eclipse 格式化程序首选项中使用的切换按钮:
目前我已经尝试过以下方式:
public class Exercise extends JFrame {
private String[] buttonNames = {"A", "B", "C", "D", "E"};
Exercise() {
final JPanel topPanel = new JPanel();
topPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
int tabCount = 0;
final ButtonGroup topButtonGroup = new ButtonGroup();
for (String buttonName : buttonNames) {
JToggleButton tabButton = new JToggleButton(buttonName);
topButtonGroup.add(tabButton);
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(0, -6, 0, -7); // Questionable line
c.gridx = tabCount;
c.gridy = 0;
topPanel.add(tabButton, c);
tabCount++;
}
this.add(topPanel);
this.setVisible(true);
this.pack();
}
public static void main(String[] args) {
new Exercise();
}
}
结果如下:
我对我的代码有一些担忧。首先,我不明白为什么我必须将插图设为负数。根据Oracle 的教程,“[b] 默认情况下,每个组件都没有外部填充。” 因此,默认情况下不应该没有空格吗?没有负插图,结果如下所示:
其次,我想让切换按钮变暗而不是在切换“打开”时变成蓝色。有没有简单的方法通过 Java Swing 做到这一点?最后,一般来说有没有更好的方法?我很想知道 Eclipse 是如何设法让切换按钮看起来像是完美连接的。
更新
我已尝试按照建议使用 BoxLayout。不幸的是,这似乎并没有解决问题。结果几乎与上图相同。这是修改后的构造函数:
Exercise() {
final JPanel topPanel = new JPanel();
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.X_AXIS));
final ButtonGroup topButtonGroup = new ButtonGroup();
for (String buttonName : buttonNames) {
JToggleButton tabButton = new JToggleButton(buttonName);
// tabButton.setBorder(BorderFactory.createBevelBorder(
// BevelBorder.RAISED, Color.LIGHT_GRAY, Color.DARK_GRAY));
topButtonGroup.add(tabButton);
topPanel.add(tabButton);
}
this.add(topPanel);
this.setVisible(true);
this.pack();
}
有趣的是,当我尝试添加上面注释的边框时,按钮之间的额外间距不知何故消失了。结果如下:
我希望尽可能保持按钮的一般外观,但边缘更矩形,以便切换按钮看起来更加连接。