删除Substance LAF中JTabbedPane上的内容填充

时间:2013-04-11 10:04:52

标签: java swing look-and-feel jtabbedpane substance

我正在使用Substance LAF进行一些实验,我正在尝试删除标签之间的填充。使用默认的ui:

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

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

2 个答案:

答案 0 :(得分:1)

  • 使用UIManager for JTabbedPane无法覆盖此值,

  • 这是一个非常普遍的问题,大多数方法都受到保护(如果它们作为UIManager中的键发布并不重要)而不覆盖自己的BasicTabbedPaneUI


  • 物质

enter image description here

javax.swing.plaf.InsetsUIResource[top=4,left=4,bottom=4,right=4]
false
  • 金属(跨平台)

enter image description here

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

enter image description here

null
null

系统(Java6上的win8)

enter image description here

javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=3,right=3]
true
    如果key的值为Instets(0,0,0,0)或InsetsUIResource(0,0,0,0),则
  • 无关紧要

由Kirill创建的修改代码

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)*/;
            }
        });
    }
}

答案 1 :(得分:1)

感谢@mKorbel提供的信息,我发现通过使用可以达到同样的效果 将SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND设置为SubstanceConstants.TabContentPaneBorderKind.SINGLE_PLACEMENT

http://insubstantial.github.io/insubstantial/substance/docs/clientprops/TabbedPaneContentBorderKind.html