如何在JavaSwing中实现TabbedPane的四边阴影效果?

如何在JavaSwing中实现TabbedPane的四边阴影效果?,java,swing,awt,jtabbedpane,nimbus,Java,Swing,Awt,Jtabbedpane,Nimbus,我正在尝试为Tabbedpane获得四边阴影效果 我的代码如下所示 MianClass import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.UIManager; cl

我正在尝试为Tabbedpane获得四边阴影效果

我的代码如下所示

MianClass

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;

class NimbusBaseDemo extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JTabbedPane tabbedPane;
    int i;

    private UIManager.LookAndFeelInfo[] lafs;

    public NimbusBaseDemo() {
        try {

            // Set nimbus look and feel. nimbusBase works only for it.
            new NimbusBaseUI();

        } catch (Exception e) {
            e.printStackTrace();
        }

        setTitle("Nimbus Base Demo");
        setSize(400, 400);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("World Cities", new CitiesPanel());
        tabbedPane.addTab("Colors ", new ColorsPanel());
        tabbedPane.addTab("World Cities", new CitiesPanel());

        add(tabbedPane);
    }

    public static void main(String args[]) {

        new NimbusBaseDemo();
    }

    class CitiesPanel extends JPanel {

        public CitiesPanel() {
            JButton b1 = new JButton("New York");
            add(b1);
            JButton b2 = new JButton("London");
            add(b2);
            JButton b3 = new JButton("Hong Kong");
            add(b3);
            JButton b4 = new JButton("Tokyo");
            add(b4);
        }
    }

    class ColorsPanel extends JPanel {

        public ColorsPanel() {

            JCheckBox cb1 = new JCheckBox("Red");
            cb1.setEnabled(true);
            add(cb1);

            JCheckBox cb2 = new JCheckBox("Green");
            cb2.setEnabled(true);
            add(cb2);
            JCheckBox cb3 = new JCheckBox("Blue");
            add(cb3);
        }
    }
}
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;

public class NimbusBaseUI extends NimbusLookAndFeel {

    public NimbusBaseUI() {
        super(); // Initialisation and installating
        try {
            new TabbedPaneTheme(this);
            UIManager.setLookAndFeel(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void initialize() {
        // TODO Auto-generated method stub
        super.initialize();
    }

}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;

import javax.swing.Painter;
import javax.swing.plaf.ColorUIResource;

public class TabbedPaneTheme {
    private Color light, dark;
    private GradientPaint gradPaint;

    protected int strokeSize = 1;
    /** Color of shadow */
    /** Color of shadow */
    protected Color shadowColor = new Color(128, 128, 128, 140);
    // protected Color shadowColor = new Color(0,0,0);
    /** Sets if it drops shadow */
    protected boolean shady = true;
    /** Sets if it has an High Quality view */
    protected boolean highQuality = false;
    /** Double values for Horizontal and Vertical radius of corner arcs */
    protected Dimension arcs = new Dimension(10, 10);
    /** Distance between shadow border and opaque panel border */
    protected int shadowGap = 1;
    /** The offset of shadow. */
    protected int shadowOffset = 1; // width of the shadow
    /** The transparency value of shadow. ( 0 - 255) */
    protected int shadowAlpha = 130;

    public TabbedPaneTheme(NimbusBaseUI nimbusUI) {
        // TODO Auto-generated constructor stub

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].shadow",
                ColorUIResource.BLUE);
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab.contentMargins",
                new Insets(0, 6, 10, 6)); // (// top, left, bottom, right)
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea.contentMargins",
                new Insets(0, 0, -6, 0));
        nimbusUI.getDefaults().put("TabbedPane.tabAreaInsets",
                new Insets(2, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.contentBorderInsets",
                new Insets(-1, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.tabsOverlapBorder",
                new Insets(-5, -5, -5, -5));

        nimbusUI.getDefaults().put("Panel.opaque", false);
        nimbusUI.getDefaults().put("TabbedPane.shadow", new Color(255, 0, 0));
        nimbusUI.getDefaults().put("TabbedPane.focus", new Color(255, 0, 0));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].backgroundPainter",
                new TabbedPanePainter(new Color(98, 97, 93), new Color(127,
                        127, 119)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].textForeground",
                new Color(255, 255, 255));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Enabled].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea[Enabled].backgroundPainter",
                new TabbedPane_TabView_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Enabled].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Focused].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Default].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.backgroundPainter",
                new TabbedPane_TabContent_Painter(Color.WHITE, Color.WHITE));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneContent.background",
                Color.WHITE);

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Selected].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Focused].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Pressed].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
    }

    public class TabbedPane_TabContent_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabContent_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha);
            if (highQuality) {
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
            }
            if (shady) {
                g.setColor(shadowColorA);
                g.fillRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width,
                        arcs.height);
            } else {
                shadowGap = 1;
            }
            gradPaint = new GradientPaint((w / 2.0f), 0, new Color(255, 255,
                    255), (w / 2.0f), (h / 2.0f), new Color(255, 255, 255),
                    false);
            g.setPaint(gradPaint);
            g.fillRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setColor(new Color(188, 188, 187, 130));
            g.setStroke(new BasicStroke(strokeSize));
            g.drawRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setStroke(new BasicStroke());
        }
    }

    public class TabbedPane_TabView_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabView_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
        }
    }

    public class TabbedPanePainter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPanePainter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
            // g.fillRect(2, 2, (w - 5), (h - 5));
            g.fillRoundRect(2, 2, (w - 5), (h - 5), 6, 6);
        }
    }
}
我扩展了NimbusLookAndFeel类,以获得选项卡式窗格的默认主题。因此,我的项目中的所有选项卡窗格都遵循相同的主题

NimbusBaseUI类

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;

class NimbusBaseDemo extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JTabbedPane tabbedPane;
    int i;

    private UIManager.LookAndFeelInfo[] lafs;

    public NimbusBaseDemo() {
        try {

            // Set nimbus look and feel. nimbusBase works only for it.
            new NimbusBaseUI();

        } catch (Exception e) {
            e.printStackTrace();
        }

        setTitle("Nimbus Base Demo");
        setSize(400, 400);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("World Cities", new CitiesPanel());
        tabbedPane.addTab("Colors ", new ColorsPanel());
        tabbedPane.addTab("World Cities", new CitiesPanel());

        add(tabbedPane);
    }

    public static void main(String args[]) {

        new NimbusBaseDemo();
    }

    class CitiesPanel extends JPanel {

        public CitiesPanel() {
            JButton b1 = new JButton("New York");
            add(b1);
            JButton b2 = new JButton("London");
            add(b2);
            JButton b3 = new JButton("Hong Kong");
            add(b3);
            JButton b4 = new JButton("Tokyo");
            add(b4);
        }
    }

    class ColorsPanel extends JPanel {

        public ColorsPanel() {

            JCheckBox cb1 = new JCheckBox("Red");
            cb1.setEnabled(true);
            add(cb1);

            JCheckBox cb2 = new JCheckBox("Green");
            cb2.setEnabled(true);
            add(cb2);
            JCheckBox cb3 = new JCheckBox("Blue");
            add(cb3);
        }
    }
}
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;

public class NimbusBaseUI extends NimbusLookAndFeel {

    public NimbusBaseUI() {
        super(); // Initialisation and installating
        try {
            new TabbedPaneTheme(this);
            UIManager.setLookAndFeel(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void initialize() {
        // TODO Auto-generated method stub
        super.initialize();
    }

}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;

import javax.swing.Painter;
import javax.swing.plaf.ColorUIResource;

public class TabbedPaneTheme {
    private Color light, dark;
    private GradientPaint gradPaint;

    protected int strokeSize = 1;
    /** Color of shadow */
    /** Color of shadow */
    protected Color shadowColor = new Color(128, 128, 128, 140);
    // protected Color shadowColor = new Color(0,0,0);
    /** Sets if it drops shadow */
    protected boolean shady = true;
    /** Sets if it has an High Quality view */
    protected boolean highQuality = false;
    /** Double values for Horizontal and Vertical radius of corner arcs */
    protected Dimension arcs = new Dimension(10, 10);
    /** Distance between shadow border and opaque panel border */
    protected int shadowGap = 1;
    /** The offset of shadow. */
    protected int shadowOffset = 1; // width of the shadow
    /** The transparency value of shadow. ( 0 - 255) */
    protected int shadowAlpha = 130;

    public TabbedPaneTheme(NimbusBaseUI nimbusUI) {
        // TODO Auto-generated constructor stub

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].shadow",
                ColorUIResource.BLUE);
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab.contentMargins",
                new Insets(0, 6, 10, 6)); // (// top, left, bottom, right)
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea.contentMargins",
                new Insets(0, 0, -6, 0));
        nimbusUI.getDefaults().put("TabbedPane.tabAreaInsets",
                new Insets(2, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.contentBorderInsets",
                new Insets(-1, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.tabsOverlapBorder",
                new Insets(-5, -5, -5, -5));

        nimbusUI.getDefaults().put("Panel.opaque", false);
        nimbusUI.getDefaults().put("TabbedPane.shadow", new Color(255, 0, 0));
        nimbusUI.getDefaults().put("TabbedPane.focus", new Color(255, 0, 0));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].backgroundPainter",
                new TabbedPanePainter(new Color(98, 97, 93), new Color(127,
                        127, 119)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].textForeground",
                new Color(255, 255, 255));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Enabled].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea[Enabled].backgroundPainter",
                new TabbedPane_TabView_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Enabled].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Focused].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Default].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.backgroundPainter",
                new TabbedPane_TabContent_Painter(Color.WHITE, Color.WHITE));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneContent.background",
                Color.WHITE);

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Selected].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Focused].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Pressed].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
    }

    public class TabbedPane_TabContent_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabContent_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha);
            if (highQuality) {
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
            }
            if (shady) {
                g.setColor(shadowColorA);
                g.fillRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width,
                        arcs.height);
            } else {
                shadowGap = 1;
            }
            gradPaint = new GradientPaint((w / 2.0f), 0, new Color(255, 255,
                    255), (w / 2.0f), (h / 2.0f), new Color(255, 255, 255),
                    false);
            g.setPaint(gradPaint);
            g.fillRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setColor(new Color(188, 188, 187, 130));
            g.setStroke(new BasicStroke(strokeSize));
            g.drawRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setStroke(new BasicStroke());
        }
    }

    public class TabbedPane_TabView_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabView_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
        }
    }

    public class TabbedPanePainter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPanePainter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
            // g.fillRect(2, 2, (w - 5), (h - 5));
            g.fillRoundRect(2, 2, (w - 5), (h - 5), 6, 6);
        }
    }
}
最后,我编写了一个自定义主题类来应用TabbedPane。这里我将tabbedpane属性参数放在NimbusLookAndFeel的getdefaults()方法中

选项卡式窗格名称类

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;

class NimbusBaseDemo extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JTabbedPane tabbedPane;
    int i;

    private UIManager.LookAndFeelInfo[] lafs;

    public NimbusBaseDemo() {
        try {

            // Set nimbus look and feel. nimbusBase works only for it.
            new NimbusBaseUI();

        } catch (Exception e) {
            e.printStackTrace();
        }

        setTitle("Nimbus Base Demo");
        setSize(400, 400);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("World Cities", new CitiesPanel());
        tabbedPane.addTab("Colors ", new ColorsPanel());
        tabbedPane.addTab("World Cities", new CitiesPanel());

        add(tabbedPane);
    }

    public static void main(String args[]) {

        new NimbusBaseDemo();
    }

    class CitiesPanel extends JPanel {

        public CitiesPanel() {
            JButton b1 = new JButton("New York");
            add(b1);
            JButton b2 = new JButton("London");
            add(b2);
            JButton b3 = new JButton("Hong Kong");
            add(b3);
            JButton b4 = new JButton("Tokyo");
            add(b4);
        }
    }

    class ColorsPanel extends JPanel {

        public ColorsPanel() {

            JCheckBox cb1 = new JCheckBox("Red");
            cb1.setEnabled(true);
            add(cb1);

            JCheckBox cb2 = new JCheckBox("Green");
            cb2.setEnabled(true);
            add(cb2);
            JCheckBox cb3 = new JCheckBox("Blue");
            add(cb3);
        }
    }
}
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;

public class NimbusBaseUI extends NimbusLookAndFeel {

    public NimbusBaseUI() {
        super(); // Initialisation and installating
        try {
            new TabbedPaneTheme(this);
            UIManager.setLookAndFeel(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void initialize() {
        // TODO Auto-generated method stub
        super.initialize();
    }

}
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;

import javax.swing.Painter;
import javax.swing.plaf.ColorUIResource;

public class TabbedPaneTheme {
    private Color light, dark;
    private GradientPaint gradPaint;

    protected int strokeSize = 1;
    /** Color of shadow */
    /** Color of shadow */
    protected Color shadowColor = new Color(128, 128, 128, 140);
    // protected Color shadowColor = new Color(0,0,0);
    /** Sets if it drops shadow */
    protected boolean shady = true;
    /** Sets if it has an High Quality view */
    protected boolean highQuality = false;
    /** Double values for Horizontal and Vertical radius of corner arcs */
    protected Dimension arcs = new Dimension(10, 10);
    /** Distance between shadow border and opaque panel border */
    protected int shadowGap = 1;
    /** The offset of shadow. */
    protected int shadowOffset = 1; // width of the shadow
    /** The transparency value of shadow. ( 0 - 255) */
    protected int shadowAlpha = 130;

    public TabbedPaneTheme(NimbusBaseUI nimbusUI) {
        // TODO Auto-generated constructor stub

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].shadow",
                ColorUIResource.BLUE);
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab.contentMargins",
                new Insets(0, 6, 10, 6)); // (// top, left, bottom, right)
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea.contentMargins",
                new Insets(0, 0, -6, 0));
        nimbusUI.getDefaults().put("TabbedPane.tabAreaInsets",
                new Insets(2, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.contentBorderInsets",
                new Insets(-1, -1, -1, -5));
        nimbusUI.getDefaults().put("TabbedPane.tabsOverlapBorder",
                new Insets(-5, -5, -5, -5));

        nimbusUI.getDefaults().put("Panel.opaque", false);
        nimbusUI.getDefaults().put("TabbedPane.shadow", new Color(255, 0, 0));
        nimbusUI.getDefaults().put("TabbedPane.focus", new Color(255, 0, 0));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+Pressed].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Default+Enabled+Selected+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Focused+Selected+MouseOver].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter",
                new TabbedPanePainter(new Color(255, 255, 255), new Color(255,
                        255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].font",
                new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Focused+Selected].textForeground",
                new Color(91, 113, 132));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].font",
                        new Font("Myriad Pro", Font.BOLD, 12));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+Selected+MouseOver+Pressed+Focused].textForeground",
                        new Color(91, 113, 132));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].backgroundPainter",
                new TabbedPanePainter(new Color(98, 97, 93), new Color(127,
                        127, 119)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled].textForeground",
                new Color(255, 255, 255));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneTab[Enabled].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter",
                        new TabbedPanePainter(new Color(255, 255, 255),
                                new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].textForeground",
                new Color(91, 113, 132));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTab[Enabled+MouseOver].font",
                new Font("Myriad Pro", Font.BOLD, 12));

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneTabArea[Enabled].backgroundPainter",
                new TabbedPane_TabView_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneTabArea[Focused+Selected+MouseOver].backgroundPainter",
                        new TabbedPane_TabView_Painter(
                                new Color(255, 255, 255), new Color(255, 255,
                                        255)));

        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Enabled].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Focused].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Default].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.backgroundPainter",
                new TabbedPane_TabContent_Painter(Color.WHITE, Color.WHITE));
        nimbusUI.getDefaults().put("TabbedPane:TabbedPaneContent.background",
                Color.WHITE);

        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+MouseOver].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Selected].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Focused].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
        nimbusUI.getDefaults().put(
                "TabbedPane:TabbedPaneContent.[Selected].backgroundPainter",
                new TabbedPane_TabContent_Painter(new Color(255, 255, 255),
                        new Color(255, 255, 255)));
        nimbusUI.getDefaults()
                .put("TabbedPane:TabbedPaneContent.[Enabled+Pressed].backgroundPainter",
                        new TabbedPane_TabContent_Painter(new Color(255, 255,
                                255), new Color(255, 255, 255)));
    }

    public class TabbedPane_TabContent_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabContent_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha);
            if (highQuality) {
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
            }
            if (shady) {
                g.setColor(shadowColorA);
                g.fillRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width,
                        arcs.height);
            } else {
                shadowGap = 1;
            }
            gradPaint = new GradientPaint((w / 2.0f), 0, new Color(255, 255,
                    255), (w / 2.0f), (h / 2.0f), new Color(255, 255, 255),
                    false);
            g.setPaint(gradPaint);
            g.fillRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setColor(new Color(188, 188, 187, 130));
            g.setStroke(new BasicStroke(strokeSize));
            g.drawRoundRect(shadowOffset,// X position
                    shadowOffset,// Y position
                    w - strokeSize - shadowOffset, // width
                    h - strokeSize - shadowOffset, // height
                    arcs.width, arcs.height);// arc Dimension
            g.setStroke(new BasicStroke());
        }
    }

    public class TabbedPane_TabView_Painter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPane_TabView_Painter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
        }
    }

    public class TabbedPanePainter implements Painter {
        private Color light, dark;
        private GradientPaint gradPaint;

        public TabbedPanePainter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            Color shadowColor = Color.black;
            Color shadowColorA = new Color(shadowColor.getRed(),
                    shadowColor.getGreen(), shadowColor.getBlue(), 150);
            g.setColor(shadowColorA);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f),
                    (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
            // g.fillRect(2, 2, (w - 5), (h - 5));
            g.fillRoundRect(2, 2, (w - 5), (h - 5), 6, 6);
        }
    }
}
我得到的结果是

但是我想在选项卡窗格的四个面上设置阴影效果,并为选定的选项卡窗格选项卡设置阴影。 像这样


安抚你的帮助和建议

要更快获得更好的帮助:

  • 检查此项:并从
    选项卡窗格me
    类中删除不必要的键,例如
    选项卡窗格:…font
    选项卡窗格:选项卡窗格内容。[启用+按下]…
  • 删除不相关代码:
    颜色浅、暗
    CitiesPanel
    ColorsPanel
    类,
    NimbusBaseUI#initialize()
    方法
  • TabbedPane\u TabView\u Painter
    什么都不做

以下是我的尝试:

import java.awt.*;
导入java.awt.geom.*;
导入javax.swing.*;
导入javax.swing.plaf.nimbus.NimbusLookAndFeel;
公共类NimbusTabbedPaneTest{
公共JComponent makeUI(){
JTabbedPane tabbedPane=新的JTabbedPane();
addTab(“世界城市”,新的JScrollPane(新的JTree());
addTab(“颜色”,新的JSplitPane());
addTab(“世界城市”,新的JScrollPane(新的JTextArea());
tabbedPane.setBorder(BorderFactory.createEmptyByOrder(5,5,5,5));
返回选项卡窗格;
}
公共静态void main(字符串…参数){
EventQueue.invokeLater(()->{
试一试{
新的NimbusBaseUI();
}捕获(例外e){
e、 printStackTrace();
}
JFrame f=新JFrame(“Nimbus基地演示”);
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的NimbusTabbedPaneTest().makeUI());
f、 设置大小(400400);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
});
}
}
类NimbusBaseUI扩展了NimbusLookAndFeel{
公共NimbusBaseUI(){
超级();
试一试{
新的TabbedPaneTheme(this);
UIManager.setLookAndFeel(this);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类选项卡窗格名称{
受保护的静态积分过积分=6;
受保护的静态int shadowOffset=1;
受保护静态int strokeSize=2;
受保护静态尺寸弧=新尺寸(10,10);
公共选项卡窗格名称(NimbusBaseUI nimbusUI){
UIDefaults d=nimbusUI.getDefaults();
d、 put(“TabbedPane:TabbedPaneContent.contentMargins”,新的插图(0,5,5,5));
//d、 put(“TabbedPane:TabbedPaneTab.contentMargins”,新的插图(2,8,3,8));
//d、 put(“TabbedPane:tabbedpanetabera.contentMargins”,新插图(3,10,4,10));
d、 放置(“TabbedPane:tabbedpanetabera.contentMargins”,
新插图(3、10、二层漆、10);
Painter tabAreaPainter=新的tabAreaPainter();
d、 放置(“TabbedPane:TabbedPaneTabera[Disabled]。backgroundPainter”,
(画家);
d、 put(“TabbedPane:TabbedPaneTabera[Enabled].backgroundPainter”,
(画家);
d、 put(“TabbedPane:tabbedpanetabera[Enabled+MouseOver].backgroundPainter”,
(画家);
d、 put(“TabbedPane:TabbedPaneTabera[Enabled+Pressed].backgroundPainter”,
(画家);
d、 put(“TabbedPane:TabbedPaneContent.backgroundPainter”,
新标签内容画家());
Painter tabPainter=新的tabPainter(Color.ORANGE,false);
d、 put(“TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter”,
制表符);
d、 放置(“TabbedPane:TabbedPaneTab[Enabled+Pressed].backgroundPainter”,
制表符);
d、 放置(“TabbedPane:TabbedPaneTab[Enabled].backgroundPainter”,
制表符);
Painter selectedTabPainter=new TabPainter(Color.WHITE,true);
d、 放置(“TabbedPane:TabbedPaneTab[Focused+MouseOver+Selected]。背景画家”,
所选的油漆工);
d、 放置(“TabbedPane:TabbedPaneTab[聚焦+按下+选中]。背景画家”,
所选的油漆工);
d、 放置(“TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter”,
所选的油漆工);
d、 放置(“TabbedPane:TabbedPaneTab[MouseOver+Selected]。背景画家”,
所选的油漆工);
d、 放置(“TabbedPane:TabbedPaneTab[Selected]。backgroundPainter”,
所选的油漆工);
d、 放置(“TabbedPane:TabbedPaneTab[按下+选定]。背景画家”,
所选的油漆工);
}
私有静态类TabPainter实现Painter{
私人最终颜色;
私有int r=6;
私有整数x=3;
私人智力y=3;
选择私有布尔值;
公共选项卡绘制器(颜色,选择布尔值){
这个颜色=颜色;
this.selected=selected;
}
@替代公共空白绘制(图形2D g、J组件c、整型宽度、整型高度){
int ex=所选?覆盖:0;
Graphics2D g2=(Graphics2D)g.create(0,0,宽度,高度+ex);
g2.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
int w=宽度-6-1;
int h=高度+r;
对于(int i=0;i<3;i++){
g2.setColor(新颜色(0,0,0,20));
g2.填充(新的圆形矩形2D.双(x-i,y-i,w+i+i,h,r,r));
}
g2.设置颜色(颜色);
g2.填充(新的圆形矩形2D.双(x,y,w,h+4,r,r));
g2.dispose();
}
}
私有静态类TabAreaPainter实现Painter{
@覆盖公共空白绘制(图形2D g、J组件c、int