在 Java 选项卡式窗格中控制颜色
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2120728/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Controlling Color in Java Tabbed Pane
提问by Elliott
I have been going nuts trying to figure this out.
我一直在努力解决这个问题。
I am trying to elimenate a light blue background that appears in a JTabbedPane. I've tried everything and nothing seems to work.
我试图消除出现在 JTabbedPane 中的浅蓝色背景。我已经尝试了一切,但似乎没有任何效果。
Below is my code. If you run it, it will show the tab, when selected with a light blue background and a thing blue border at the top. I want to control this color. But how?
下面是我的代码。如果你运行它,它会显示选项卡,选择时带有浅蓝色背景和顶部的蓝色边框。我想控制这个颜色。但是如何?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.ColorUIResource;
public class Main extends JFrame {
JTabbedPane tab=new JTabbedPane();
public Main() {
setSize(300,300);
setTitle("Test Tab pane");
tab.add("First",new myPanel("First"));
tab.add("Second",new myPanel("Second"));
tab.add("Third",new myPanel("Third"));
tab.add("Fourth",new myPanel("Fourth"));
tab.addChangeListener(new ChangeTab());
getContentPane().add(tab,BorderLayout.CENTER);
setVisible(true);
for(int i=0;i<tab.getTabCount();i++){
if(i != tab.getSelectedIndex())
tab.setBackgroundAt(i,Color.orange);
tab.setForeground(Color.BLACK);
}
tab.setOpaque(true);
UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected",ColorUIResource.GREEN);
UIManager.put("TabbedPane.background",ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN);
}
public static void main(String[] args) {
Main main = new Main();
}
class ChangeTab implements ChangeListener{
public void stateChanged(ChangeEvent e){
tab.validate();
System.out.println(tab.getSelectedIndex());
for(int i=0;i<tab.getTabCount();i++){
if(i != tab.getSelectedIndex())
tab.setBackgroundAt(i,Color.orange);
}
}
}
class myPanel extends JPanel{
public myPanel(String str){
add(new JLabel(str));
}
}
}
回答by Grundlefleck
I used your example code, and what worked for me was moving the calls to UIManager.put()to a point where they would be executed before the JTabbedPane constructor was executed.
我使用了您的示例代码,对我有用的是将调用移动到UIManager.put()在执行 JTabbedPane 构造函数之前执行它们的点。
public class Main extends JFrame {
JTabbedPane tab;
public Main() {
// ... other stuff
UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected",ColorUIResource.GREEN);
UIManager.put("TabbedPane.background",ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN);
// now construct the tabbed pane
tab=new JTabbedPane();
// ... other stuff
}
There's also some other properties available (for the Metal L&F, at least):
还有一些其他属性可用(至少对于 Metal L&F):
UIManager.put("TabbedPane.borderColor", Color.RED);
UIManager.put("TabbedPane.darkShadow", ColorUIResource.RED);
UIManager.put("TabbedPane.light", ColorUIResource.RED);
UIManager.put("TabbedPane.highlight", ColorUIResource.RED);
UIManager.put("TabbedPane.focus", ColorUIResource.RED);
UIManager.put("TabbedPane.unselectedBackground", ColorUIResource.RED);
UIManager.put("TabbedPane.selectHighlight", ColorUIResource.RED);
UIManager.put("TabbedPane.tabAreaBackground", ColorUIResource.RED);
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.RED);
These let you control most of the colours in the tab area.
这些使您可以控制选项卡区域中的大部分颜色。
I found with these settings there was still a very small blue-ish grey border around the content. I have searched for how to set this colour to no avail. The only solution I could find to get rid of this was:
我发现使用这些设置,内容周围仍然有一个非常小的蓝灰色边框。我已经搜索了如何设置这种颜色无济于事。我能找到的唯一解决方案是:
UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0));
Which is a sub-optimal solution.
这是一个次优的解决方案。
回答by Mathias Weyel
Check the results with these values.
使用这些值检查结果。
UIManager.put("TabbedPane.contentAreaColor", Color.GREEN);
UIManager.put("TabbedPane.light", ColorUIResource.GREEN);
UIManager.put("TabbedPane.highlight", ColorUIResource.GREEN);
UIManager.put("TabbedPane.shadow", ColorUIResource.GREEN);
UIManager.put("TabbedPane.darkShadow", ColorUIResource.GREEN);
UIManager.put("TabbedPane.selected", ColorUIResource.GREEN);
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN);
As you can see, the only way, to get the dark border on top of the panel the color you want is to set "borderHightlightColor" to the desired Color. Unfortunately, this has the side effects that can be seen (green border around all tabs). And still, there is this gray line between the green ones that comes from the background.
如您所见,要在面板顶部获得所需颜色的黑色边框,唯一的方法是将“borderHightlightColor”设置为所需的颜色。不幸的是,这具有可以看到的副作用(所有选项卡周围的绿色边框)。而且,在来自背景的绿色线之间仍然有这条灰色线。
I think the only real solution to this is to override your MetalTabbedPaneUI. If you only set contentAreaColor and do empty overrides for the methods
我认为唯一真正的解决方案是覆盖您的 MetalTabbedPaneUI。如果您只设置 contentAreaColor 并对方法进行空覆盖
paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h);
the result should be near the one I suspect you want to get.
结果应该接近我怀疑你想要的结果。
回答by AJ.
Attempt 2: I fixed my border problem and changed look and feel manager. This still is not exactly what you are looking for though..
尝试 2:我修复了边框问题并更改了外观管理器。这仍然不是你正在寻找的东西。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.ColorUIResource;
public class Main extends JFrame {
JTabbedPane tab=new JTabbedPane();
public Main() {
setBackground(Color.white);
setSize(300,300);
setTitle("Test Tab pane");
tab.add("First",new myPanel("First"));
tab.add("Second",new myPanel("Second"));
tab.add("Third",new myPanel("Third"));
tab.add("Fourth",new myPanel("Fourth"));
tab.addChangeListener(new ChangeTab());
tab.setBackground(Color.white);
tab.setForeground(Color.black);
tab.setBorder(BorderFactory.createEmptyBorder());
getContentPane().add(tab,BorderLayout.CENTER);
setVisible(true);
}
public static void main (String[] args) throws Exception {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
Main main = new Main();
}
class ChangeTab implements ChangeListener{
public void stateChanged(ChangeEvent e){
tab.validate();
System.out.println(tab.getSelectedIndex());
}
}
class myPanel extends JPanel{
public myPanel(String str){
setBackground(Color.white);
setBorder(BorderFactory.createEmptyBorder());
add(new JLabel(str));
}
}
}

