2010-01-22 4 views
6

Je suis allé fou essayer de comprendre cela. J'essaie d'élimer un fond bleu clair qui apparaît dans un JTabbedPane. J'ai tout essayé et rien ne semble fonctionner.Contrôle de la couleur dans le volet à onglets Java

Voici mon code. Si vous l'exécutez, il affichera l'onglet, lorsqu'il est sélectionné avec un fond bleu clair et une bordure bleue en haut. Je veux contrôler cette couleur. Mais comment?

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

Avez-vous essayé d'utiliser un LookAndFeel différent ou d'utiliser 'UIManager.put' avant d'afficher votre' JFrame'? –

Répondre

9

J'utilisé votre code d'exemple, et ce qui a fonctionné pour moi a été le déplacement des appels à UIManager.put() à un point où ils seraient exécutés avant que le constructeur JTabbedPane était réalisé.

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 
} 

Il y a aussi d'autres propriétés disponibles (pour le métal L & F, au moins):

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

Ceux-ci vous permettent de contrôler la plupart des couleurs dans la zone de l'onglet.

J'ai trouvé avec ces paramètres qu'il y avait toujours une très petite bordure grise bleu-ish autour du contenu. J'ai cherché comment régler cette couleur en vain. La seule solution que j'ai pu trouver pour me débarrasser de ceci était:

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

Qui est une solution sous-optimale.

+0

En fait, cela fonctionne pour moi. Pourquoi l'appelez-vous sous-optimal? – Elliott

+0

Parce que, et je ne suis pas sûr à ce sujet, cela fera que le contenu de l'onglet se trouve à l'envers. Par exemple. Si vous avez un composant, comme un bouton dans la zone Nord, le haut du bouton touchera le haut de l'onglet, ce qui n'est probablement pas ce que vous voulez quand vous préférez simplement contrôler la couleur. – Grundlefleck

+0

Ouais. J'ai réfléchi à cela, mais j'ai réussi à y remédier en plaçant une bordure autour de la zone de contenu du conteneur accessible par TabbedPane. La bordure qui n'est pas une propriété du JTabbedPane lui-même mais du conteneur. Cette frontière est complètement contrôlable par moi et résout ainsi le problème (bien que ce ne soit pas la solution la plus élégante). Mais encore une fois, l'implmentation de ce contrôle Swing n'est pas non plus. – Elliott

0

Tentative 2: Je fixe mon problème à la frontière et a changé look and feel gestionnaire. C'est toujours pas exactement ce que vous cherchez bien ..

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()' prend un javax.swing.border.Border, pas un objet Color. La couleur est-elle extraite de l'objet Border à la place? – Grundlefleck

+0

Quelqu'un a posté la réponse, mais maintenant il est parti. Pourquoi? bug dans Stackoverflow? L'anwwer doit d'abord définir les paramètres dans UIManager puis créer l'objet. Faites-le à l'envers et le code ne fonctionne pas. – Elliott

+0

@Elliot: Je l'ai supprimé moi-même car il ne résout pas votre problème, seulement une partie de celui-ci. Je vois encore la bordure grise bleu-ish autour du panneau intérieur. Même en utilisant cette réponse aussi. – Grundlefleck

2

Vérifiez les résultats avec ces valeurs.

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

Comme vous pouvez le voir, la seule façon, pour obtenir la bordure noire au-dessus du panneau de la couleur que vous voulez est de définir « borderHightlightColor » à la couleur désirée. Malheureusement, cela a les effets secondaires qui peuvent être vus (bordure verte autour de tous les onglets). Et encore, il y a cette ligne grise entre les verts qui vient de l'arrière-plan.

Je pense que la seule vraie solution à cela est de remplacer votre MetalTabbedPaneUI. Si vous définissez seulement contentAreaColor et faire overrides vides pour les méthodes

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

le résultat devrait être proche de celui que je suppose que vous voulez obtenir.

Questions connexes