2010-01-22 2 views
6

Я собираюсь сходить с ума, пытаясь понять это.Управление цветом в панели с вкладками Java

Я пытаюсь устранить светло-голубой фон, который появляется в JTabbedPane. Я пробовал все, и ничего не работает.

Ниже приведен мой код. Если вы запустите его, он отобразит вкладку, когда она будет выбрана с голубым фоном, а также синяя грань вверху. Я хочу контролировать этот цвет. Но как?

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

} 
+0

Пробовал ли вы использовать другой LookAndFeel или использовать 'UIManager.put' перед отображением вашего' JFrame'? –

ответ

9

Я использовал свой пример кода, и то, что работал для меня двигалось призывы к 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 
} 

Там также некоторые другие доступные свойства (для металла 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); 

Они позволяют контролировать большинство цветов в закладке области.

Я нашел с этими настройками по-прежнему очень маленькую серо-голубую границу вокруг содержимого. Я искал, как установить этот цвет безрезультатно. Единственное решение, которое я мог найти, чтобы избавиться от этого было:

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

Это недооптимальное решение.

+0

Собственно, это работает для меня. Почему вы называете его субоптимальным? – Elliott

+0

Потому что, и я не уверен в этом, он заставит содержимое вкладки сидеть прямо против краев. Например. если у вас есть компонент, например кнопка в северной области, верхняя часть кнопки будет касаться верхней части вкладки, что, вероятно, не является тем, что вы хотите, если хотите просто контролировать цвет. – Grundlefleck

+0

Да. Я подумал об этом, но смог обратиться к нему, установив границу вокруг области содержимого контейнера, доступ к которой можно получить с помощью TabbedPane. Граница, которая не является собственностью самого JTabbedPane, а контейнера. Эта граница полностью контролируется мной и, таким образом, решает проблему (хотя, по общему признанию, не самое элегантное решение). Но опять же, это не внедрение этого контроля Swing. – Elliott

0

Попытка 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)); 
    } 
    } 

} 
+0

'setBorder()' принимает javax.swing.border.Border, а не объект Color. Вместо этого выбран цвет из объекта Border? – Grundlefleck

+0

Кто-то отправил ответ, но теперь его нет. Зачем? ошибка в Stackoverflow? Все равно, чтобы сначала установить параметры в UIManager, а затем создать объект. Сделайте это в обратном порядке, и код не работает. – Elliott

+0

@Elliot: Я удалил его сам, потому что он не решает вашу проблему, только ее часть. Я все еще вижу серо-голубую границу вокруг внутренней панели. Даже используя этот ответ. – Grundlefleck

2

Проверьте результаты с этими значениями.

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

Как вы можете видеть, единственный способ, чтобы получить темную границу на верхней части панели цвет вы хотите, чтобы установить «borderHightlightColor» нужный цвет. К сожалению, у этого есть побочные эффекты, которые можно увидеть (зеленая граница вокруг всех вкладок). И все же, есть серая линия между зелеными, которая исходит из фона.

Я думаю, что единственным реальным решением для этого является переопределение вашего 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); 

результат должен быть рядом с той, которую я подозреваю, вы хотите получить.

Смежные вопросы