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(); }

}

4

6 回答 6

9

您可以做一些不同的事情,具体取决于您想要对确切颜色进行多少控制。最简单的方法是更改​​ UIManager 中的一些属性以更改 Nimbus 从中派生其他颜色的颜色。我对您的代码进行了一些尝试,发现如果我在调用 UIManager.setLookAndFeel() 之后放置以下代码,它将近似于您在示例中尝试的红底黑外观:

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

我把它留给你去试验。有关更多信息进行试验,这里有一篇关于配置 Nimbus 的好文章。请务必查看他的链接,标题为“Nimbus UIDefaults Properties List”。除了将颜色按摩到与您想要的相似的颜色之外,您还必须开始做一些杂乱的事情,例如实现进行自定义绘画的 Painter 类。

于 2010-03-24T23:38:33.427 回答
3

我不想打破它,但你将很难改变前景色和背景色。与许多基本组件(JTextField、JLabel 等)不同,JTabbedPane 在设置绘制时会忽略前景色和背景色。相反,它允许 UI 委托(由当前外观确定)选择颜色。

一些外观和感觉允许颜色主题(想到Substance ),但 Nimbus 似乎将这些颜色值硬编码到绘制代理中。

您很可能需要基于 Nimbus 实现自己的 UI 委托。请参阅此处了解更多信息。 这将是一个很大的痛苦,所以问问自己你希望这些颜色改变多少。

最后,如果有人告诉您简单地继承 JTabbedPane 并在您自己的“paintComponent”方法中设置颜色,请忽略它。然后,您将负责整个组件的绘制,并且将失去任何类似 Nimbus 的视觉属性。

于 2010-03-23T20:28:57.113 回答
2

当您向其添加组件时,JTabbedPane 可以工作,例如添加 5 个 JPanel,它们将被标记。

于 2010-03-15T07:17:01.620 回答
2

对不起我的英语不好。

我尝试解决这个问题 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);

我的天啊!!这是工作!

于 2012-01-20T09:39:22.450 回答
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);
}

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

于 2010-03-15T07:27:56.833 回答
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());            

        }
    }

....

}

扬·卡伊瑟姆

它应该是什么样子(不要介意 QuadSpline 选项卡和关闭栏,这是我的 UI 实现的另一个附加组件),我在这里的声誉没有,所以有一个图像链接

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

于 2012-06-30T15:24:43.017 回答