如何在 Java 中创建带有连接按钮的 ButtonGroup?
Posted
技术标签:
【中文标题】如何在 Java 中创建带有连接按钮的 ButtonGroup?【英文标题】:How to create a ButtonGroup with connected buttons in Java? 【发布时间】:2014-02-14 02:58:54 【问题描述】:我目前正在尝试创建一组类似于 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's tutorial,“[b]y 默认情况下,每个组件都没有外部填充。”因此,默认情况下不应该没有空格吗?没有负插入,结果如下所示:
其次,我想让切换按钮变暗,而不是在切换“打开”时变成蓝色。有没有简单的方法通过 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();
有趣的是,当我尝试添加上面注释的边框时,按钮之间的额外间距不知何故消失了。结果如下:
我希望尽可能保持按钮的一般外观,但边缘更矩形,以便切换按钮看起来更紧密。
【问题讨论】:
我不使用 Eclipse,但该图片似乎是带有自定义外观的选项卡式窗格的标题。看起来很像Seaglass。 感谢您的评论,它间接帮助我找到了解决方案。 【参考方案1】:您可以使用 BoxLayout 之类的布局来消除空间。 GridBagLayout 并不是唯一的布局。推荐阅读:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
您还可以调用JButton 函数,如setBorder() 和setBackground() 来实现您提到的效果。一如既往,API 是您最好的朋友:http://docs.oracle.com/javase/7/docs/api/
【讨论】:
感谢您的建议,但我仍然遇到一些问题,正如我在上面的问题中更新的那样。【参考方案2】:看来我犯了一个尴尬的错误。我尝试了 dic19 提出的将 Seaglass' 外观与 JTabbedPane 结合使用的建议,我几乎得到了我想要的:
但后来我意识到 JTabbedPane 的默认外观和感觉正是我想要的:
我使用的代码与 Oracle 在JTabbedPane tutorial 中使用的代码相似:
public class SeaGlassExercise
public static void initWindow()
JFrame frame = new JFrame("Application Name");
CustomTabbedPane content = new CustomTabbedPane();
frame.setContentPane(content);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationByPlatform(true);
// try
// UIManager.setLookAndFeel(
// "com.seaglasslookandfeel.SeaGlassLookAndFeel");
// catch (Exception e)
// e.printStackTrace();
//
// SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
initWindow();
);
class CustomTabbedPane extends JPanel
public CustomTabbedPane()
super(new GridLayout(1, 1));
JTabbedPane tabbedPane = new JTabbedPane();
JComponent panel1 = makeTextPanel("Panel #1");
tabbedPane.addTab("AAA", panel1);
JComponent panel2 = makeTextPanel("Panel #2");
tabbedPane.addTab("BBB", panel2);
JComponent panel3 = makeTextPanel("Panel #3");
tabbedPane.addTab("CCC", panel3);
JComponent panel4 = makeTextPanel("Panel #4");
tabbedPane.addTab("DDD", panel4);
add(tabbedPane);
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
protected JComponent makeTextPanel(String text)
JPanel panel = new JPanel();
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
虽然我知道 Java Swing 依赖于平台的默认外观在不同平台上是不同的,但我从没想过 JTabbedPane 看起来与教程中显示的有如此大的不同:
【讨论】:
个人觉得整个swing UI默认的外观极其丑陋。如果您使用的是 Mac,则 Swing 将默认使用 Apple 制造的 Aqua 外观和感觉,并包括 Apple 制造的所有“标准”按钮、切换按钮,以及是的选项卡式窗格。以上是关于如何在 Java 中创建带有连接按钮的 ButtonGroup?的主要内容,如果未能解决你的问题,请参考以下文章
如何在iphone的子视图页面中创建带有导航返回按钮的导航栏