2

我正在用 Substance LAF 做一些实验,我正在尝试删除选项卡之间的填充。使用默认用户界面,我使用:

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

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

4

2 回答 2

1

感谢@mKorbel 提供的信息,我发现我可以通过使用设置SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND来实现相同的效果SubstanceConstants.TabContentPaneBorderKind.SINGLE_PLACEMENT

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

于 2013-04-11T16:34:24.127 回答
1
  • 此值无法通过使用 UIManager for JTabbedPane 来覆盖,

  • 这是一个很常见的问题,大多数方法都受到保护(无论它们是否作为 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)都没有关系

最初由 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)*/;
            }
        });
    }
}
于 2013-04-11T10:44:33.727 回答