Java JTabbedPanel更改所选选项卡背景色

Java JTabbedPanel更改所选选项卡背景色,java,swing,colors,border,jtabbedpane,Java,Swing,Colors,Border,Jtabbedpane,我正试图根据所选选项卡更改JTabbedPane边框的颜色。通过回答和回答,我做到了: import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.basic.BasicTabbedPaneUI; public class TabbedPaneTest impleme

我正试图根据所选选项卡更改JTabbedPane边框的颜色。通过回答和回答,我做到了:

import java.awt.*;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.basic.BasicTabbedPaneUI;

public class TabbedPaneTest implements Runnable {
    JTabbedPane pane = new JTabbedPane();;

    public void run() {
        // magenta border first so any changes will be obvious
        setTabbedPaneBorderColor(new Color(255, 0, 255));

        JPanel container = new JPanel();
        container.setSize(new Dimension(500, 200));
        pane.setPreferredSize(new Dimension(400, 200));
        pane.addTab("A", createTab(Color.RED));
        pane.addTab("B", createTab(Color.YELLOW));
        pane.addTab("C", createTab(Color.BLUE));
        pane.addChangeListener(new TabSelected());
        container.add(pane);

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(container);
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createTab(Color color) {
        JPanel p = new JPanel();
        p.setBorder(BorderFactory.createLineBorder(color, 2));
        return p;
    }

    private class TabSelected implements ChangeListener {

        @Override
        public void stateChanged(ChangeEvent e) {
            int index = pane.getSelectedIndex();

            switch (index) {
            case 0:
                setTabbedPaneBorderColor(Color.RED);
                break;
            case 1:
                setTabbedPaneBorderColor(Color.YELLOW);
                break;
            case 2:
                setTabbedPaneBorderColor(Color.BLUE);
                break;
            }

        }

    }

    public void setTabbedPaneBorderColor(Color tabBorderColor) {

        UIManager.put("TabbedPane.borderHightlightColor", tabBorderColor);
        UIManager.put("TabbedPane.darkShadow", tabBorderColor);
        UIManager.put("TabbedPane.shadow", tabBorderColor);
        UIManager.put("TabbedPane.light", tabBorderColor);
        UIManager.put("TabbedPane.highlight", tabBorderColor);
        UIManager.put("TabbedPane.focus", tabBorderColor);
        UIManager.put("TabbedPane.selectHighlight", tabBorderColor);


        pane.setUI(new BasicTabbedPaneUI() {
               @Override
               protected void installDefaults() {
                   super.installDefaults();
                   highlight = UIManager.getColor("TabbedPane.light");
                   lightHighlight = UIManager.getColor("TabbedPane.highlight");
                   shadow = UIManager.getColor("TabbedPane.shadow");
                   darkShadow =UIManager.getColor("TabbedPane.darkShadow");
                   focus = UIManager.getColor("TabbedPane.focus");
               }
            });
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new TabbedPaneTest());
    }
}
特别是,setTabbedPaneBorderColor()方法完全符合我的要求(即,它修改选项卡周围的花式边框,而不是其中包含的面板上的边框或JTabbedPane占据的整个空间周围的普通矩形边框)。出于某种原因,这个例子抛出了一个在我的实际程序中没有出现的错误(我认为它与SwingWorker和EDT有关)。现在,我正试图找出如何更改所选选项卡的背景

相关财产为:

UIManager.put("TabbedPane.selected",Color.MAGENTA);
然而,我似乎没有办法在tabUI中使用它(这让人费解,但在BasicTabbedPaneUI中没有背景颜色变量)

编辑:希望有更有知识的人会给你一个好的答案,但是如果你用谷歌搜索的话,我目前的解决方案是使用中性色作为所选标签的背景色,因为似乎没有简单的方法来更新它。我还切换到了一个中性的选项卡边框(即使您可以更新它,如示例所示),并在包含的JPanel中创建了彩色边框。这并不理想,但看起来相当不错,我现在没有时间继续寻找更清洁的解决方案

这对我来说很有用

            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+Pressed].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter", new BackgroundPainter(Color.GRAY));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white));
            UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Selected].backgroundPainter", new BackgroundPainter(Color.white));
背景画家班
public类BackgroundPainter实现Painter{
私有颜色=空;
背景画家(c色){
颜色=c;
}
@凌驾
公共空白绘制(Graphics2D g、JComponent对象、整型宽度、整型高度){
如果(颜色!=null){
g、 设置颜色(颜色);
g、 fillRect(0,0,宽度-1,高度-1);
}
}
}

对我来说,它起作用了,我只是在创建JTabbedPane对象之前设置UImanager的TabbedPane.selected color属性

 UIManager.put("TabbedPane.selected", Color.red);

      tabbedPane = new JTabbedPane();
参考这个链接,我相信它也会为你工作

 UIManager.put("TabbedPane.selected", Color.red);

      tabbedPane = new JTabbedPane();