更改JTabbedPane中的活动选项卡颜色

时间:2014-05-02 20:58:40

标签: java swing jtabbedpane

如何在选择时更改标签的颜色?和它的边界?在这种情况下,它的Arbitros标签是蓝色的,我该如何更改?我在JTabbedPane内使用JFrame我发现了这个但是它无效UIManager.put("TabbedPane.selected", Color.white);我做错了什么?

public VentanaPrincipal_vista() {

    super("Ventana Principal");

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(1000, 500);
    this.setResizable(false);
    this.setUndecorated(true);
    this.setBackground(Color.BLUE);
    // add tabbedPane and tabs .

    tabs = new JTabbedPane();
    tabs.setBackground(new Color(83, 83, 83));
    tabs.setForeground(new Color(255, 255, 255));
    tabs.setBorder(null);
    UIManager.put("TabbedPane.selected", Color.white);
    this.add(tabs);

    menuBar = new BGMenuBar();
    menuBar.setColor(new Color(83, 83, 83));
    this.setJMenuBar(menuBar);

    menu = new JMenu("File");
    menu.setForeground(Color.white);
    menuBar.add(menu);

    close = new JMenuItem("Close");

    menu.add(close);
    close.addActionListener(this);
    close.setBackground(new Color(83, 83, 83));
    close.setForeground(new Color(255, 255, 255));

    op1 = new JMenuItem("option 1");
    op1.setBackground(new Color(83, 83, 83));
    op1.setForeground(new Color(255, 255, 255));

    menu.add(op1);

    this.setLocationRelativeTo(null);
    this.setVisible(true);

}// end of constructor

enter image description here

4 个答案:

答案 0 :(得分:6)

对我来说,下面的解决方案有效,我只是在创建JTabbedPane对象之前设置了UImanager的TabbedPane.selected颜色属性。

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

      tabbedPane = new JTabbedPane();

请参阅此链接,我相信它也适合您。

http://esus.com/changing-the-color-of-the-selected-tab-of-a-jtabbedpane/

答案 1 :(得分:0)

对CodeyX1答案的评论: 对我来说,uimanager未选择状态与这些值一起使用(中间没有“Tab”字样):

UIManager.put("TabbedPane.unselectedForeground", Color.xxx)
UIManager.put("TabbedPane.selectedBackground", Color.xxx)

答案 2 :(得分:-1)

请从java docs中检查以下方法以获取JTabbedPane

http://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html#eg

void setBackgroundAt(int,Color)

答案 3 :(得分:-1)

试试这个:

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;

public class TabHighlight extends JPanel
{
    private static final int MAX = 5;
    private JTabbedPane pane = new JTabbedPane();

    public TabHighlight()
    {
        for (int i = 0; i < MAX; i++)
        {
            Color color     = Color.black;   //Set default tab background to black
            pane.add("Tab " + String.valueOf(i), new TabContent(pane, i, color));

            pane.setBackgroundAt(i, color);
            pane.setForegroundAt(i, Color.white);
        }

        this.add(pane);
    }

    private static class TabContent extends JPanel
    {
        private TabContent(JTabbedPane panel, int i, Color color)
        {
            //Active and inactive tab coloring must be done
            //when rendering the CONTENT of the JTabbedPane object

            //Override these default settings to allow for active and inactive
            //tab background color changing

            panel.setUI(new BasicTabbedPaneUI()
            {
                @Override
                protected void installDefaults()
                {
                    super.installDefaults();

                    highlight       = Color.lightGray;
                    lightHighlight  = Color.white;

                    shadow          = Color.gray;
                    darkShadow      = Color.darkGray;

                    //Active tab background is white
                    //so set the focus color to white
                    //to hide the active tab focus
                    //marker seeing that we want the
                    //active tab backgound to be different
                    focus           = Color.black;
                }
            });

            //Set the active tab background to white
            UIManager.put("TabbedPane.selected", Color.gray);

            UIManager.put("TabbedPane.unselectedTabBackground", Color.black);

            //Remove borders
            UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0));

            setOpaque(true);

            setBackground(color);
            setForeground(Color.white);

            add(new JLabel("Tab content " + String.valueOf(i)));
        }

        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(320, 240);
        }
    }

    public void display()
    {
        JFrame f = new JFrame("TabHighlight");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    //Use this function here to change the look and feel to Java's default
    //If using a mac with OS X Yosemite or another recent Mac OS X release
    public static void initLookAndFeel()
    {
        try
        {
            UIManager.setLookAndFeel(
              UIManager.getCrossPlatformLookAndFeelClassName()
              );
        } 
        catch(UnsupportedLookAndFeelException e)
        {

        }
        catch(ClassNotFoundException e)
        {

        }
        catch(InstantiationException e)
        {

        }
        catch(IllegalAccessException e)
        {

        }
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    initLookAndFeel();
                    new TabHighlight().display();
                }
            });
    }
}

让我们来看看这段代码,它会在程序启动时添加5个标签:

public TabHighlight()
{
    for (int i = 0; i < MAX; i++)
    {
       Color color     = Color.black;   //Set default tab background to black
       Color color2    = Color.white;   //Set default tab foreground to white

       pane.add("Tab " + String.valueOf(i), new TabContent(pane, i, color));

       pane.setBackgroundAt(i, color);
       pane.setForegroundAt(i, Color.white);
    }

    this.add(pane);
}

您要求帮助实施计划的第一个区域是&#34; for&#34;块。我将尝试以您将理解的方式解释这一点。

前两行定义每个非活动选项卡的默认背景和前景色。您可以将这些更改为您喜欢的颜色。

第三行添加一个包含以下属性的选项卡:

  1. 定义将在选项卡上显示的文本的字符串
  2. 标签号,如果您不想
  3. ,则不必包含此标签
  4. 创建第二段代码,我将在此之后获得
  5. 第四行应用默认背景颜色

    最后一行应用默认前景色。注意:UIManager无法更改这些属性。我尝试了一些替代方法,但没有成功。 Darn,我希望有一种更简单的方法来实现这一点。

    现在让我们仔细看看定义活动和非活动标签外观的代码片段:

        private TabContent(JTabbedPane panel, int i, Color color)
        {
            //Active and inactive tab coloring must be done
            //when rendering the CONTENT of the JTabbedPane object
    
            //Override these default settings to allow for active and inactive
            //tab background color changing
    
            panel.setUI(new BasicTabbedPaneUI()
            {
                @Override
                protected void installDefaults()
                {
                    super.installDefaults();
    
                    highlight       = Color.lightGray;
                    lightHighlight  = Color.white;
    
                    shadow          = Color.gray;
                    darkShadow      = Color.darkGray;
    
                    //Active tab background is white
                    //so set the focus color to white
                    //to hide the active tab focus
                    //marker seeing that we want the
                    //active tab backgound to be different
                    focus           = Color.black;
                }
            });
    
            //Set the active tab background to white
            UIManager.put("TabbedPane.selected", Color.gray);
    
            //Set the inactive tab background to black
            UIManager.put("TabbedPane.unselectedTabBackground", Color.black);
    
            //Remove borders
            UIManager.put("TabbedPane.contentBorderInsets"
                          , new Insets(0, 0, 0, 0));
    
            setOpaque(true);
    
            setBackground(color);
            setForeground(Color.white);
    
            add(new JLabel("Tab content " + String.valueOf(i)));
        }
    

    在此部分代码中,执行以下操作:

    1. 使用下面的代码块覆盖UI

      panel.setUI(new BasicTabbedPaneUI() { //place the code from step 2 here }

    2. 输入该部分的以下属性:

      highlight = Color.lightGray; lightHighlight = Color.white; shadow = Color.gray; darkShadow = Color.darkGray; focus = Color.black;

      就像在第一个代码段中一样,您也可以更改这些属性。这是一点点 提示:每个标签在标签标签周围都有一个小点框,这标志着焦点。如果 如果要隐藏此标记,只需将其颜色设置为与活动标签的颜色相匹配, 现在有了重点。

    3. 使用UIManager更改以下属性: UIManager.put("TabbedPane.selected", Color.gray); UIManager.put("TabbedPane.unselectedTabBackground", Color.black);

      这将允许您在程序期间更改活动的非活动标签背景 运行时。

      您使用UIManager这是实现您尝试的最佳方式 去做。在这里使用这段代码可以让您进行所需的更改 对于,但您可以在执行任何这些更改之前执行第2步 影响。 UIManager.put("TabbedPane.selectedForeground", Color.xxx)UIManager.put("TabbedPane.unselectedTabForeground", Color.xxx)不要改变 前景色,前景色保持不变。 UIManager.put("TabbedPane.selected", Color.xxx) 更改背景颜色 活动标签和UIManager.put("TabbedPane.unselectedTabBackground")将会 更改无效标签的背景颜色。

    4. 将这两段代码复制并粘贴到您的文件中,然后根据需要进行更改。

      我建议您将整个源代码复制到顶部并将其粘贴到编译器中,然后再运行它。通过这种方式,您可以看到此程序的功能,当您返回到正在使用的原始代码时,您将知道将这些代码段放在何处。

      希望这有帮助。

      如果您遇到此问题,请在回复中发布SSCCE,以便查看您遇到问题的位置。

      感谢。