有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何消除Nimbus LAF中按钮周围的空间?

我需要在一个非常小的地方放置一些按钮,问题是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中注释掉的代码中所看到的,我尝试了很多方法,但它们没有删除按钮周围的空间

编辑:根据评论中的讨论,似乎无法删除按钮矩形边缘和绘制的圆形矩形轮廓之间的空间。Nimbus保留这两个像素用于“聚焦高光”,如果不重新实现大量Nimbus功能,这一点可能无法改变

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


共 (2) 个答案

  1. # 1 楼答案

    方法1:

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

    方法2:

        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","[][][]"));
    
  2. # 2 楼答案

    请注意,如果设置背景色,然后调用setOpaque(true),则可以看到这些按钮彼此紧靠在一起。这就是Nimbus绘制按钮的方式;我认为你不能改变按钮的矩形边缘和绘制的圆形矩形轮廓之间的距离

    如果空间非常宝贵,可以通过取消UIDefaults行的注释并修改contentMargins属性(但不要使用0,0,0,使用类似于2,8,2,8的内容)来缩小大小