6
votes

Contrôler la couleur dans le volet Java Tabbed

Je suis allé fou essayant de comprendre cela.

J'essaie d'éliminer un fond bleu clair qui apparaît dans un Jtabbedpane. J'ai tout essayé et rien ne semble fonctionner. P>

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

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

}


1 commentaires

Avez-vous essayé d'utiliser un autre lookandfeel ou en utilisant uimanager.put avant d'afficher votre jframe ?


3 Réponses :


0
votes

tentative 2: J'ai réparé mon problème de frontière et j'ai changé le regard et le gestionnaire de sens. Ce n'est toujours pas exactement ce que vous recherchez ..

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

} 


4 commentaires

SetForder () prend un javax.swing.border.border, pas un objet de couleur. La couleur est-elle prise de l'objet frontière à la place?


Quelqu'un a posté la réponse mais maintenant c'est parti. Pourquoi? Bug in Stackoverflow? L'AWWWER doit d'abord définir des paramètres dans l'UIMANAGER, puis créez l'objet. Faites-le en sens inverse et le code ne fonctionne pas.


@Elliot: Je l'ai supprimé moi-même parce que cela ne résout pas votre problème, mais une seule partie. Je vois toujours la bordure grise bleu-ish autour du panneau intérieur. Même en utilisant cette réponse aussi.


Je ne sais pas comment cela aide. Si vous définissez l'arrière-plan sur le vert sous la méthode du panneau, vous avez toujours le problème.



11
votes

J'ai utilisé votre code exemple et ce qui a fonctionné pour moi déplacerait les appels vers uimanager.pan () code> à un point où ils seraient exécutés avant l'exécution du constructeur JTABDEDPANE.

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


3 commentaires

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


Parce que, et je ne suis pas sûr de cela, cela rendra le contenu de l'onglet assis sur les bords. Par exemple. Si vous avez un composant là-bas, tel qu'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éreriez simplement contrôler la couleur.


Ouais. J'y ai pensé, mais j'ai pu y remédier en mettant une frontière autour de la zone de contenu du conteneur accédé par le Tabbedpane. La frontière qui n'est pas une propriété de Jtabbedpane elle-même mais du conteneur. Cette frontière est complètement contrôlable par moi et résout ainsi le problème (bien que certes, pas la solution la plus élégante). Mais là encore, la implication de ce contrôle pivotante n'est pas non plus.



3
votes

Vérifiez les résultats avec ces valeurs.

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


0 commentaires