【问题标题】:How to get rid of the space around buttons in Nimbus LAF?如何摆脱 Nimbus LAF 中按钮周围的空间?
【发布时间】:2016-01-27 15:20:09
【问题描述】:

我需要将一些 JButtons 放在一个很小的地方,问题是 Nimbus LAF 会自动在它们周围放置一些空间,结果按钮看起来比实际要小。

在下面的示例程序中,我使用了具有 0 个水平和垂直间隙的 FlowLayout,并且我希望按钮可以紧密地放置,它们之间没有任何空间。如果我注释掉 Nimbus LAF 的设置,它们会按预期运行。

import javax.swing.*;
import java.awt.FlowLayout;

public class NimbusSpace {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                buildGUI();
            }
        });
    }

    private static void buildGUI() {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
        p.add(createButton("aa"));
        p.add(createButton("bb"));
        p.add(createButton("cc"));

        f.add(p);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static JButton createButton(String text) {
        JButton b = new JButton(text);

//        b.setBorder(null);
//        b.setBorderPainted(false);
//        b.setMargin(new Insets(0,0,0,0));
//        b.putClientProperty("JComponent.sizeVariant", "large");
//        b.putClientProperty("JComponent.sizeVariant", "mini");

//        UIDefaults def = new UIDefaults();
//        def.put("Button.contentMargins", new Insets(0,0,0,0));
//        b.putClientProperty("Nimbus.Overrides", def);

        return b;
    }
}

正如您在 createButton 中注释掉的代码中看到的那样,我尝试了很多东西,但它们并没有删除按钮周围的空间。

编辑:根据 cmets 中的讨论,似乎无法移除按钮矩形边缘与绘制的圆角矩形轮廓之间的空间。 Nimbus 为“焦点高光”保留这两个像素,如果不重新实现许多 Nimbus 功能,这可能无法更改。

所以我接受了 guleryuz 的技巧:如果按钮位于重叠和负位置,它们可以看起来更大。在实践中这个想法似乎可行,但它不是一个非常干净的解决方案,所以如果您知道更好(并且相当容易实现)的解决方案,请不要犹豫回答......

【问题讨论】:

  • 你的意思是按钮应该像这样在一起? stackoverflow.com/questions/34782238/…
  • @hamena314 我的实际问题是我在一个小地方有一些小按钮,这个问题使它们看起来比实际更小。我的例子只是为了说明问题。您的示例看起来很有趣,但我想要常规的 Nimbus 按钮,只是看起来更大。
  • “间距”是为“焦点突出”留出空间
  • @MadProgrammer 你可能是对的,间距是两个像素,焦点高亮也是两个像素。如果我用 guleryuz 的 hack 将大小增加一个像素,剩下的一像素高光对我来说已经足够了,实际上焦点高光对于这个按钮根本不重要。
  • guleryuz 的“hack”有点危险,因为它不会同时修改组件的大小以进行补偿,并且可能会导致一堆意想不到且难以重复的问题

标签: java swing nimbus


【解决方案1】:

方法一:

JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, -4, 0));

方法二:

    JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
    p.add(createButton("aa", 1));
    p.add(createButton("bb", 2));
    p.add(createButton("cc", 3));

对 createButton 方法进行了一些修改

private static JButton createButton(String text, final int s) {
    JButton b = new JButton(text){
        @Override
        public void setLocation(int x, int y) {
            super.setLocation(x-(s*4), y);
        }
    };
    return b;
}

方法 3

JPanel p = new JPanel(new MigLayout("ins 0, gap -5","[][][]"));

【讨论】:

  • 将按钮放在另一个按钮顶部的非常有创意的技巧,并且在这个简单的示例中有效,但我的真正问题是不同的,布局更复杂,所以我仍然希望会有成为在这种情况下也有效的答案
  • 哦,伙计,你是个创意天才!我认为在最坏的情况下,我需要编写一个复杂的布局管理器,将组件放置到疯狂的负和重叠位置,但是通过这个技巧,我已经实现了我想要的外观。在实际代码中,我还需要重写 setSize,而且我必须小心,因为布局管理器调用了两次 setLocation,所以我保留了一个标志以仅针对第一次调用进行调整。我投了赞成票,但我还没有接受 - 也许有人找到了一个合适的、强大的解决方案。
  • 今晚我正在为你的接受工作;)在你提到布局管理器之后,一道闪电提醒我我最喜欢的布局管理器 MigLayout,我已经编辑了我的答案
  • 嗯,我听说过有关 MigLayout 的好消息,但我从未使用过它,而且目前“ins 0, gap -5”、“[][][]” 的符号看起来很吓人我,所以仍然“方法2”看起来最好。顺便说一句,如果你足够疯狂到晚上工作这样的问题,真正的代码是一个开源项目(Pixelitor),如果你有兴趣,我可以解释问题到底出在哪里。
  • 我下载并运行了 Pixelitor,你的作品真的很棒。
【解决方案2】:

请注意,如果您设置背景颜色,然后调用 setOpaque(true),您可以看到按钮彼此正对着。这就是 Nimbus 绘制按钮的方式;我认为您无法更改按钮的矩形边缘与绘制的圆角矩形轮廓之间的空间。

如果空间很重要,您可以通过取消注释 UIDefaults 行并修改 contentMargins 属性来稍微缩小尺寸(但不要使用 0,0,0,0,使用 2,8,2,8 之类的东西)。

【讨论】:

  • 没错。问题是按钮看起来比实际小,我们同意这一点。但我仍然希望有一个解决方案。是的,问题是空间很宝贵,我在一个小地方有一些小按钮,这个问题让它们看起来比实际更小。 2,8,2,8 技巧并没有改变实际代码中的任何内容,我仍在试图理解为什么。
  • 我现在看到,“Button.contentMargins”只影响按钮的首选大小,但我已经在实际代码中将其设置为固定值和较小的值,所以这对我没有帮助。正如您所说,问题在于按钮的矩形边缘与绘制的圆角矩形轮廓之间的空间。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 2021-10-08
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2016-12-21
相关资源
最近更新 更多