【问题标题】:Why is addSeparator() not working with my JToolBar?为什么 addSeparator() 不能与我的 JToolBar 一起使用?
【发布时间】:2010-07-07 17:26:04
【问题描述】:

我无法让 JSeparator 显示在 JToolBar 中。我的工具栏创建如下:

public class ToolBar extends JToolBar {
    super();

    FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 10, 5);
    setLayout(layout);

    add(new JButton("Button 1"));
    addSeparator();
    add(new JButton("Button 2"));
    add(new JButton("Button 3"));
    addSeparator();

    // Show
    setVisible(true);
    setFloatable(false);

}

任何想法都将不胜感激,我一直试图让它工作太久了>(

【问题讨论】:

  • 嗯,你确定你提供的代码是你实际使用的,我不确定这会编译吗?是缺少方法声明吗...?
  • fd,通过删除所有自定义代码解决了您的评论。这应该很容易编译,并且仍然展示了我希望解决的问题。谢谢!

标签: java swing layout jtoolbar


【解决方案1】:

在那里尝试您的代码,当我调用addSeparator() 方法时,它会在按钮之间创建一个空格,但没有可见的分隔线。

但如果我将方法更改为addSeparator(new Dimension(20,20)),则会创建可见的分隔线。

问题可能是默认外观创建了一个高度为 1 的分隔符,因此您无法看到它。

我在 Mac OSX 上运行它。

【讨论】:

  • 是的,这与我遇到的解决方法相同。我认为这可能只是默认 OS X LAF 的问题
  • 我还发现,如果你在工具栏上保留默认布局,虚线也会出现在那里。
【解决方案2】:

您遇到的最大问题是不需要子类 JToolBar 并在其上设置布局。只需创建它的一个实例并开始添加按钮和分隔符。

一般来说,Swing 团队不建议对 Swing 组件进行子分类。

您的代码应如下所示:

JToolBar t = new JToolbar();

t.add(new JButton("Button 1"));
t.addSeparator();
t.add(new JButton("Button 2"));
t.add(new JButton("Button 3"));
t.addSeparator();

// Show
t.setVisible(true);
t.setFloatable(false);

最后的建议是不要使用按钮。使用动作。这样可以在工具栏、菜单等上使用相同的操作。更多信息http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

更新: 工具栏分隔符的外观取决于您使用的 LAF。

【讨论】:

  • eugener,我实际上一直在挣扎。我有很多子类项目——JToolbar、JPanel、JButton 等——其中大多数根本不需要是子类。我一直在尝试不将我所有的代码都写到一个方法或一个类中!!我可以做到,但它就像 20 页长并且难以维护。从某种意义上说,我知道子类化不是正确的做法,但我也不想要巨大的不可维护的文件:(。基本上,我不知道这里的“正确”答案。你有什么一般性建议吗?这个?!
  • 最常见的处理方法是创建“构建”方法。例如,如果您需要构建工具栏,您可以创建 JToolBar buildToobar() 方法,您可以在其中创建、配置和返回您的工具栏。唯一需要对 Swing 组件进行子类化的时候是需要向它们添加新的状态和/或行为。
  • 嗯。我想我可以使用 Factory 类,这样我的主类就不会被 build...() 方法弄得臃肿不堪?
  • 根据我的经验,在很多情况下我都有非常常用的构建方法。例如,我有一个方法,我传入一个动作集合,它为我构建了一个工具栏,另一个从同一个动作集合中为我构建了一个菜单。当然也有一些非常具体的,我通常将它们保留为需要它们的容器/面板的一部分——它们通常引用容器的一些内部变量。希望它有意义:) 更新:看看 jgoodies.com 上的代码示例。
【解决方案3】:

我遇到了同样的问题。我发现根本原因是由最大尺寸引起的。

调整后就正常了。

    // ---------------------------------------
    // debug below:
    // ---------------------------------------
    JSeparator separator = new JSeparator(JSeparator.VERTICAL);
    System.err.println("getMaximumSize(): " + separator.getMaximumSize());
    System.err.println("getMinimumSize(): " + separator.getMinimumSize());
    separator.setMaximumSize(new Dimension(2, separator.getMaximumSize().height));


    // ---------------------------------------
    // real sample below
    // ---------------------------------------
    // adds a vertical space bar
    toolBar.add(Box.createHorizontalStrut(5));

    // adds a vertical separator
    JSeparator separator = new JSeparator(JSeparator.VERTICAL);
    Dimension maximumSize = separator.getMaximumSize();
    maximumSize.width = 2;
    separator.setMaximumSize(maximumSize); // Important! Update it!
    toolBar.add(separator);

    // adds a vertical space bar
    toolBar.add(Box.createHorizontalStrut(5));

TJ Tsai (tsungjung411@yahoo.com.tw)

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2020-10-08
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2013-07-02
    • 2015-11-08
    相关资源
    最近更新 更多