为JTabbedPane设置背景颜色

3

我正在使用Nimbus外观。我需要更改JTabbedPane中选项卡的背景颜色和前景颜色,但是颜色无法设置在JTabbedPane中。我尝试了setForeground()、setForegroundAt()、setBackground()和setBackgroundAt()方法,但都没有生效。这是我的代码


public class TabbedPaneDemo extends JFrame
{
    TabbedPaneDemo()
    {
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }
        catch(Exception ex) {}

setLayout(new BorderLayout()); setBounds(100, 100, 800, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane jt = new JTabbedPane(); jt.addTab("Tab1", new JPanel()); jt.addTab("Tab2", new JPanel()); jt.addTab("Tab3", new JPanel()); jt.addTab("Tab4", new JPanel());
for (int i = 0; i < jt.getComponentCount(); i++) { jt.setForegroundAt(i, Color.RED); jt.setBackgroundAt(i, Color.BLACK); }
add(jt);
setVisible(true); } public static void main(String args[]) { new TabbedPaneDemo(); }
6个回答

10

有几种不同的方法,取决于您希望对确切颜色有多少控制。最简单的方法是更改UIManager中的一些属性,以更改Nimbus从中派生其他颜色的颜色。我稍微调整了一下您的代码,并发现如果我在调用UIManager.setLookAndFeel()之后放置以下代码,则可以近似您在示例中尝试的红黑色外观:

     UIManager.put("nimbusBase", new ColorUIResource(0, 0, 0));
     UIManager.put("textForeground", new ColorUIResource(255, 0, 0));

我会让你自己进行实验。如果需要更多有关实验的信息,可以在这里找到一篇好的文章来配置Nimbus。确保你查看他标题为“Nimbus UIDefaults属性列表”的链接。除了将颜色调整为所需的类似颜色之外,你还需要开始执行像实现 Painter 类一样的混乱操作来进行自定义绘制。


3
很抱歉告诉你,你将会很难改变前景和背景颜色。 与许多基本组件(如JTextField、JLabel等)不同,JTabbedPane在设置绘制时忽略前景和背景颜色。相反,它允许UI代理(由当前外观决定)选择颜色。
一些外观允许使用颜色主题(例如Substance),但Nimbus似乎已将这些颜色值硬编码到绘制代理中。
很可能您需要基于Nimbus的自己实现UI代理。有关更多信息,请参见此处。这将是一个非常麻烦的过程,所以请问问自己是否真的需要改变那些颜色。
最后,如果有人告诉您只需子类化JTabbedPane并在自己的"paintComponent"方法中设置颜色,请忽略该建议。您将成为整个组件的绘图负责人,并且将失去任何类似Nimbus的视觉属性。

我支持Jason - 我花了好几天时间试图让Nimbus中的JTabbedPane显示出更暗的标签(因为当您指定浅色基色时,它们几乎变成白色)。非常令人沮丧,您需要对Nimbus内部有很深入的了解...... - Philippp

2

抱歉我的英语不好。

我尝试解决这个问题已经两天了,但是有一种“变通”方法可以解决。

需要设置选项卡组件,并为该组件设置颜色。

/*
  ...
  Setting LAF Nimbus
  ...
*/

JTabbedPane tp = new JTabbedPane();

/*
   ...
   add tabs in TabbedPane
   ...
*/

然后针对指定的选项卡需要执行以下操作:
        JLabel title = new JLabel(tp.getTitleAt(tabIndex));
        title.setForeground(Color.RED);
        tp.setTabComponentAt(tabIndex, title);

哇!太棒了,它可以工作!


+1 很好,但请注意它不能用于背景颜色。 - DNA

2

JTabbedPane可以通过添加组件来使用,例如添加5个JPanel,它们将被制作成选项卡。


我已将 panel 添加到 JTabbedPane 中。这是我的代码 JTabbedPane jt = new JTabbedPane(); jt.addTab("Tab1", new JPanel()); jt.addTab("Tab2", new JPanel()); jt.addTab("Tab3", new JPanel()); jt.addTab("Tab4", new JPanel()); jt.setForeground(Color.RED); jt.setBackground(Color.BLACK); jf.add(jt); //将 JTabbedPane 添加到 JFrame - Ram

1
如果您想更改实际内容,选项卡窗格有两种有用的方法:setForegroundAtsetBackgroundAt。您只需循环遍历所有选项卡并调用这些方法即可:
for (int i = 0; i < pane.getTabCount(); i++) {
    pane.setForegroundAt(i, foregroundColor);
    pane.setBackgroundAt(i, backgroundColor);
}

您也可以使用getComponentAt,类似地:
for (int i = 0; i < pane.getTabCount(); i++) {
    pane.getComponentAt(i).setForeground(foregroundColor);
    pane.getComponentAt(i).setBackground(backgroundColor);
}

后一种方法更灵活——您可以稍后使用类似这样的代码对所有组件进行更复杂的操作。


1

其实不是真的

new JTabbedPane().setUI(new YourUI());

然后您可以创建简单的用户界面

public class YourUI extends BasicTabbedPaneUI{

.....

private class ScrollableTabPanel extends JPanel implements UIResource {
public ScrollableTabPanel() {
    setLayout(null);
}

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.red);
g.fillRect(tabPane.getBounds());            

        }
    }

....

}

Jan Cajthaml

这就是它应该看起来的样子(不要在意QuadSpline选项卡和关闭栏,那是我UI实现的另一个插件),我的声誉在这里没有,所以这里有一张图片链接

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash3/166028_2974620064454_896181702_n.jpg


对于任何想知道如何实际实现这个的人,我在这里实现了它:https://stackoverflow.com/a/60856384/1762224 - Mr. Polywhirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接