试试这个:
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;
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)
{
panel.setUI(new BasicTabbedPaneUI()
{
@Override
protected void installDefaults()
{
super.installDefaults();
highlight = Color.lightGray;
lightHighlight = Color.white;
shadow = Color.gray;
darkShadow = Color.darkGray;
focus = Color.black;
}
});
UIManager.put("TabbedPane.selected", Color.gray);
UIManager.put("TabbedPane.unselectedTabBackground", Color.black);
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);
}
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;
Color color2 = Color.white;
pane.add("Tab " + String.valueOf(i), new TabContent(pane, i, color));
pane.setBackgroundAt(i, color);
pane.setForegroundAt(i, Color.white);
}
this.add(pane);
}
你请求程序帮助的第一个区域是“for”块。我会尝试以一种你能理解的方式来解释。
前两行定义了每个非活动选项卡的默认背景和前景颜色。您可以将其更改为您喜欢的颜色。
第三行添加了一个具有以下属性的选项卡:
- 定义选项卡上显示的文本的字符串
- 选项卡号码,如果不想包含,则不必包含
- 创建我将在此之后介绍的第二个代码片段
第四行应用默认背景颜色。
最后一行应用默认前景颜色。注意:这些属性无法使用
UIManager
更改。我尝试了几种替代方法,但没有成功。该死,我希望有一种更简单的方法来实现这一点。
现在让我们仔细看一下定义活动和非活动选项卡外观的代码片段。
private TabContent(JTabbedPane panel, int i, Color color)
{
panel.setUI(new BasicTabbedPaneUI()
{
@Override
protected void installDefaults()
{
super.installDefaults();
highlight = Color.lightGray;
lightHighlight = Color.white;
shadow = Color.gray;
darkShadow = Color.darkGray;
focus = Color.black;
}
});
UIManager.put("TabbedPane.selected", Color.gray);
UIManager.put("TabbedPane.unselectedTabBackground", Color.black);
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)));
}
在代码的这一部分中,按照以下步骤进行:
通过使用以下代码块覆盖UI
panel.setUI(new BasicTabbedPaneUI()
{
//place the code from step 2 here
}
输入该部分的这些属性:
highlight = Color.lightGray;
lightHighlight = Color.white;
shadow = Color.gray;
darkShadow = Color.darkGray;
focus = Color.black;
就像在第一个片段中一样,您也可以更改这些属性。这里有一个小提示:每个选项卡周围都有一个小点状框,标记了焦点。如果您想隐藏此标记,只需将其颜色设置为与活动选项卡的颜色相匹配,即具有焦点的选项卡。
使用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")
将更改非活动选项卡的背景颜色。
将这两个代码片段复制并粘贴到您的文件中,根据需要进行更改。
我建议您将整个源代码复制到顶部,并将其粘贴到编译器中,然后首先运行它。这样,您就能够看到此程序的功能,当您回到正在使用的原始代码时,您将知道在哪里放置这些代码片段。
希望这可以帮助您。
如果您遇到问题,请在回复中发布一个SSCCE,以便我可以看到您遇到问题的地方。
谢谢。