我正在用Substance LAF做一些实验,并且试图删除选项卡之间的填充。对于默认的ui,我使用了:

UIManager.getDefaults().put("TabbedPane.contentBorderInsets", new Insets(0,0,0,0));
UIManager.getDefaults().put("TabbedPane.tabsOverlapBorder", true);


,但这不适用于Substance,似乎提供了它自己的值。如何用物质达到相同的效果。

最佳答案

使用JTabbedPane的UIManager无法覆盖此值,
这是一个非常普遍的问题,即大多数方法都受到保护(无论它们是否作为UIManager中的键发布)都没有覆盖自己的BasicTabbedPaneUI





物质




javax.swing.plaf.InsetsUIResource[top=4,left=4,bottom=4,right=4]
false



金属(跨平台)




java.awt.Insets[top=4,left=2,bottom=3,right=3]
false



雨云




null
null


系统(Java6上的win8)



javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=3,right=3]
true



键的值是否采用Instets(0,0,0,0)或InsetsUIResource(0,0,0,0)的形式都没关系


基里尔制作的修改后的代码

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import org.pushingpixels.substance.api.DecorationAreaType;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;
import org.pushingpixels.substance.api.skin.BusinessBlueSteelSkin;
import org.pushingpixels.substance.api.skin.OfficeBlack2007Skin;
import org.pushingpixels.substance.api.skin.OfficeBlue2007Skin;

/**
 * Test application that shows the use of the
 * {@link SubstanceLookAndFeel#getDecorationType(java.awt.Component)} API called
 * on different components.
 *
 * @author Kirill Grouchnikov
 * @see SubstanceLookAndFeel#getDecorationType(java.awt.Component)
 */
public class GetDecorationType /*extends JFrame*/ {

    private static final long serialVersionUID = 1L;
    private static JFrame frame = new JFrame();

    /**
     * Creates the main frame for
     * <code>this</code> sample.
     */
    public GetDecorationType() {
        frame.setTitle("Get decoration type");
        frame.setLayout(new BorderLayout());
        final JTabbedPane tabs = new JTabbedPane();
        SubstanceLookAndFeel.setDecorationType(tabs, DecorationAreaType.HEADER);
        JPanel tab1 = new JPanel(new FlowLayout());
        tab1.add(new JTextField("sample"));
        final JComboBox combo = new JComboBox(new Object[]{"sample"});
        tab1.add(combo);
        SubstanceLookAndFeel.setDecorationType(tab1, DecorationAreaType.GENERAL);
        JPanel tab2 = new JPanel(new FlowLayout());
        tab2.add(new JTextField("sample2"));
        tab2.add(new JComboBox(new Object[]{"sample2"}));
        SubstanceLookAndFeel.setDecorationType(tab2, DecorationAreaType.GENERAL);
        tabs.addTab("tab1", tab1);
        tabs.addTab("tab2", tab2);
        frame.add(tabs, BorderLayout.CENTER);
        JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        JButton getTypes = new JButton("Get types");
        getTypes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        DecorationAreaType tabsType = SubstanceLookAndFeel.getDecorationType(tabs);
                        DecorationAreaType comboType = SubstanceLookAndFeel.getDecorationType(combo);
                        JOptionPane.showMessageDialog(frame, "Tabbed pane: " + tabsType.getDisplayName()
                                + "\n" + "Combo box: " + comboType.getDisplayName());
                    }
                });
            }
        });
        controlPanel.add(getTypes);
        frame.add(controlPanel, BorderLayout.SOUTH);
        frame.setSize(400, 200);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    /**
     * The main method for
     * <code>this</code> sample. The arguments are ignored.
     *
     * @param args Ignored.
     */
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
            /*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/
        } catch (Exception e) {
            return;
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                //SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin());
                //SubstanceLookAndFeel.setSkin(new OfficeBlack2007Skin());
                SubstanceLookAndFeel.setSkin(new OfficeBlue2007Skin());
                UIManager.put("TabbedPane.contentOpaque", Boolean.TRUE);
                System.out.println(UIManager.getDefaults().get("TabbedPane.contentBorderInsets"));
                System.out.println(UIManager.getDefaults().get("TabbedPane.tabsOverlapBorder"));
                UIManager.getDefaults().put("TabbedPane.contentBorderInsets", new javax.swing.plaf.InsetsUIResource(0, 0, 0, 0));
                UIManager.getDefaults().put("TabbedPane.tabsOverlapBorder", true);
                SwingUtilities.updateComponentTreeUI(frame);
                new GetDecorationType()/*.setVisible(true)*/;
            }
        });
    }
}

10-07 15:53