2010-01-22 13 views
6

Me he estado volviendo loco tratando de resolver esto.Controlando el color en el Panel con pestañas de Java

Estoy tratando de elminar un fondo azul claro que aparece en un JTabbedPane. He intentado todo y nada parece funcionar.

A continuación se muestra mi código. Si lo ejecuta, se mostrará la pestaña, cuando se selecciona con un fondo azul claro y un borde azul en la parte superior. Quiero controlar este color ¿Pero cómo?

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

¿Ha intentado utilizar un LookAndFeel diferente o usar 'UIManager.put' antes de mostrar su' JFrame'? –

Respuesta

9

que utiliza el código de ejemplo, y lo que funcionó para mí estaba moviendo las llamadas a UIManager.put() a un punto en el que se ejecutan antes que el constructor fue JTabbedPane ejecutado.

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 
} 

También hay algunas otras propiedades disponibles para el metal (L & F, por lo menos):

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

Estos permiten controlar la mayoría de los colores en el área de la ficha.

Encontré con estas configuraciones que aún había un pequeño borde gris azulado alrededor del contenido. He buscado cómo configurar este color en vano. La única solución que pude encontrar para deshacerme de esto fue:

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

Cuál es una solución subóptima.

+0

En realidad, esto funciona para mí. ¿Por qué lo llamas subóptimo? – Elliott

+0

Porque, y no estoy seguro de esto, hará que el contenido de la pestaña se asiente en los bordes. P.ej. si tiene un componente allí, como un botón en el área Norte, la parte superior del botón tocará la parte superior de la pestaña, que probablemente no sea la que desea cuando prefiera controlar el color. – Grundlefleck

+0

Sí. Pensé en eso, pero pude abordarlo poniendo un borde alrededor del área de contenido del contenedor al que accedió TabbedPane. El borde que no es propiedad del JTabbedPane en sí mismo sino del contenedor. Ese borde es completamente controlable por mí y, por lo tanto, resuelve el problema (aunque, ciertamente, no es la solución más elegante). Pero, de nuevo, tampoco lo es la implementación de este control de Swing. – Elliott

0

Intento 2: me fijo mi problema fronterizo y cambió verse y sentirse Manager. Esto todavía no es exactamente lo que busca, aunque ..

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()' toma un javax.swing.border.Border, no un objeto Color. ¿El color está tomado del objeto Border en su lugar? – Grundlefleck

+0

Alguien publicó la respuesta, pero ahora se ha ido. ¿Por qué? error en Stackoverflow? El objetivo es establecer los parámetros en el UIManager primero y luego crear el objeto. Hazlo en reversa y el código no funciona. – Elliott

+0

@Elliot: lo borré yo mismo porque no resuelve tu problema, solo una parte. Todavía veo el borde gris azulado alrededor del panel interior. Incluso usando esta respuesta también. – Grundlefleck

2

Compruebe los resultados con estos valores.

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

Como se puede ver, la única manera, para obtener el borde oscuro en la parte superior del panel del color que desea es establecer "borderHightlightColor" al color deseado. Desafortunadamente, esto tiene los efectos secundarios que se pueden ver (borde verde alrededor de todas las pestañas). Y aún así, hay una línea gris entre los verdes que viene del fondo.

Creo que la única solución real para esto es anular su MetalTabbedPaneUI. Si sólo se configura contentAreaColor y hacer anulaciones vacías para los métodos

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

el resultado debería ser cercana a la Sospecho que desea obtener.

Cuestiones relacionadas