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

标签 java swing look-and-feel jtabbedpane substance

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

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

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

最佳答案

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

  • 这是一个很常见的问题,大多数方法都受到保护(如果它们在 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
  • 键值的格式是否为 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)*/;
            }
        });
    }
}

关于java - 删除 Substance LAF 中 JTabbedPane 上的内容填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945977/

相关文章:

java - 模型- View -控制和 Swing GUI

java - 从类中某处声明的字符串变量中提取字符串资源?

java - jackson 无法识别的领域,即使它在类里面

java - SwingUtilities.invokeLater() 与 EventQueue.invokeLater()

java - 成功更新外观但仍有错误

java - 改变Java Swing JFrame的装饰风格

java - 我可以在 eclipse 中定义一个显示 html 文件的 View 吗?

java.lang.ArrayIndexOutOfBoundsException : 0 >= 0 in swing

java - 调整 Java Swing 大小后图像变黑

java - Nimbus TableHeader 未突出显示为 'pressed'