2010-06-26 3 views
2

J'utilise un JTabbedPane dans mon application. J'ai ajouté deux onglets qui sont des instances d'une classe personnalisée "ContentPanel". Ceci étend JPanel et définit l'arrière-plan, la frontière etc. etc. Fondamentalement cela signifie que je ne dois pas placer les propriétés de chaque JPanel que je veux appliquer ce schéma de couleur. Je remarque que non seulement leur frontière apparaît mais une autre bordure (qui, je pense, est bleue - au moins sur mon écran) apparaît autour de cette bordure, connectée à l'onglet "sélecteurs" eux-mêmes (les boutons sur lesquels vous cliquez vue appropriée). Je voudrais changer cette frontière car elle semble juste étrange contre un arrangement de couleur d'or/brun. Est-ce que quelqu'un a une idée de comment faire cela? J'ai essayé JTabbedPane.setBorder (Border b) mais cela ne marche pas. Cela définit simplement une bordure autour de tout, y compris les sélecteurs d'onglet .. pas ce que je veux.JTabbedPane - Définir la bordure par défaut autour des onglets ..?

Toute aide avec ceci serait grandement appréciée.

Répondre

12

Ces couleurs sont définies dans la présentation générale. Si vous regardez le code pour BasicTabbedPaneUI, vous remarquerez que installDefaults() définit un groupe de variables d'instance protected Color. Les touches auxquelles ils sont définis dans le L & F sont également disponibles ici.

protected void installDefaults() { 
    LookAndFeel.installColorsAndFont(tabPane, "TabbedPane.background", 
           "TabbedPane.foreground", "TabbedPane.font");  
    highlight = UIManager.getColor("TabbedPane.light"); 
    lightHighlight = UIManager.getColor("TabbedPane.highlight"); 
    shadow = UIManager.getColor("TabbedPane.shadow"); 
    darkShadow = UIManager.getColor("TabbedPane.darkShadow"); 
    //... 
    // a lot more stuff 
    //... 
} 

Si vous ne voulez pas aller aussi loin que de définir votre propre L & F, vous avez la possibilité de définir un délégué de l'interface utilisateur personnalisée sur votre fenêtre à onglets:

myTabbedPane.setUI(new BasicTabbedPaneUI() { 
    @Override 
    protected void installDefaults() { 
     super.installDefaults(); 
     highlight = Color.pink; 
     lightHighlight = Color.green; 
     shadow = Color.red; 
     darkShadow = Color.cyan; 
     focus = Color.yellow; 
    } 
}); 

vous pouvez bien sûr vouloir changer ces paramètres de couleur. Comme défini, vous verrez quelles vars sont utilisés où.

+0

Oui, cela ressemble à ce dont j'ai besoin .. merci. Est-ce que je commenterai à nouveau si j'ai des problèmes? Richard – ClarkeyBoy

+0

hmm semble fonctionner mais pas complètement. J'ai regardé toutes les variables pour BasicTabbedPaneUI et ai placé toutes les couleurs énumérées là, mais il y a toujours une frontière bleu clair/turquoise légèrement plus mince là. Il est de la même couleur que l'onglet "sélecteurs" eux-mêmes .. – ClarkeyBoy

+3

Résolu - J'ai trouvé quelqu'un de thread elses, qui dit d'utiliser UIManager.put ("TabbedPane.contentBorderInsets", de nouveaux Insets (0, 0, 0, 0)) ; aussi bien que ce que vous avez mis. Débarrassé de la frontière totalement maintenant. Merci encore. Richard – ClarkeyBoy

1

Aucune affectant L & F et solution de code de paramètres d'exécution JVM à l'échelle du système.

Créez votre propre classe à onglets et une classe imbriquée à onglet à onglets pour traiter le problème d'une classe "spécifique" de la palette à onglets. Le code ci-dessous est d'origine: (. La dernière réponse a été 2010, mais cela peut être utile aussi)

public class DisplayTabbedPane extends JTabbedPane implements 
    MouseListener, ChangeListener { 

    public DisplayTabbedPane() { 

     setTabPlacement(SwingConstants.BOTTOM); 

     // UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 
     // works but is a JVM system wide change rather than a specific change 
     NoInsetTabbedPaneUI ui = new NoInsetTabbedPaneUI(); 

     // this will build the L&F settings for various tabbed UI components. 
     setUI(ui); 

     // override the content border insets to remove the tabbed-pane 
     // blue border around the pane 
     ui.overrideContentBorderInsetsOfUI(); 

    } 

    /** 
    * Class to modify the UI layout of tabbed-pane which we wish to override 
    * in some way. This modification only applies to objects of this class. 
    * Doing UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 
    * would affect all tabbed-panes in the JVM run-time. 
    * 
    * This is free to use, no copyright but is "AS IS". 
    */ 
    class NoInsetTabbedPaneUI extends MetalTabbedPaneUI { 
     /** 
     * Create tabbed-pane-UI object to allow fine control of the 
     * L&F of this specific object. 
     */ 
     NoInsetTabbedPaneUI(){ 
      super(); 
     } 
     /** 
     * Override the content border insets of the UI which represent 
     * the L&F of the border around the pane. In this case only care 
     * about having a bottom inset. 
     */ 
     public void overrideContentBorderInsetsOfUI(){ 
      this.contentBorderInsets.top = 0; 
      this.contentBorderInsets.left = 0; 
      this.contentBorderInsets.right = 0; 
      this.contentBorderInsets.bottom = 2;   
     } 
    } 
    ........ 

} 
0

Change Look and Feel avec "UIManager"

  UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+Pressed].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter", new BackgroundPainter(Color.GRAY)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Selected].backgroundPainter", new BackgroundPainter(Color.white)); 

de classe BackgroundPainter

public class BackgroundPainter implements Painter<JComponent> { 

private Color color = null; 

BackgroundPainter(Color c) { 
    color = c; 
} 

@Override 
public void paint(Graphics2D g, JComponent object, int width, int height) { 
    if (color != null) { 
     g.setColor(color); 
     g.fillRect(0, 0, width - 1, height - 1); 
    } 
} 

}

Questions connexes