2009-08-24 4 views
4

J'ai un rendu de cellule simple qui est composé de quelques JLabel s (le moteur de rendu lui-même étend JPanel) et j'essaye de le rendre raisonnablement dans le regard de Nimbus et ressentez. Fondamentalement ce qui se passe est que dans briquet lignes (comme Nimbus a coloration de rang alternatif), mon moteur de rendu de cellule spécifique utilise la couleur d'arrière-plan de la table (qui est beaucoup plus sombre que les couleurs plus sombres). Dans mon renderer je fais:Conception de rendu de cellule simple pour l'aspect et la convivialité de Nimbus

if (isSelected) { 
    setBackground(table.getSelectionBackground); 
} 
else { 
    setBackground(table.getBackground); 
} 

Si je commente ce bloc tout le code est interrompu, alors toutes mes lignes sont dans la plus sombre ligne couleur (pas d'arrière-plan de la table, mais pas dans des couleurs alternatives non plus). Je ne suis pas sûr de comprendre ce qui peut se passer! Comment l'extrait de code ci-dessus produit-il des cellules avec des couleurs de fond différentes? La couleur table.getBackground change-t-elle entre les invocations de ma méthode?

J'ai essayé d'utiliser ce bout de code:

Color alternateColor = sun.swing.DefaultLookup.getColor(
         peer, 
         peer.getUI, 
         "Table.alternateRowColor"); 
if (alternateColor != null && row % 2 == 0) 
    setBackground(alternateColor); 

Ce qui est dans la classe DefaultTableCellRenderer. Et cela ne semble pas avoir d'effet du tout. Quelqu'un a-t-il des robots de rendu de cellules personnalisés fonctionnant avec Nimbus?

EDIT: Si quelqu'un est intéressé, cela se révèle être un problème avec Scala CellRenderer de table, comme je l'utilisais en fait Scala, pas Java. La réponse acceptée ci-dessous fonctionne très bien dans un programme Java. Question distincte classée here.

Répondre

4

Votre premier morceau de code si bien. Je pense que vous devez utiliser UIManager.getColor("Table.alternateRowColor") pour les lignes alternées et table.getBackground() sinon. Pour la ligne sélectionnée, utilisez table.getSelectionBackground(). Donc, votre code pourrait ressembler à

if (isSelected) { 
    setBackground(table.getSelectionBackground()); 
} 
else { 
    if (row % 2 == 0) { 
     setBackground(UIManager.getColor("Table.alternateRowColor")); 
    } else { 
     setBackground(table.getBackground()); 
    } 
} 

N'oubliez pas de vous assurer que votre panneau est opaque et que les étiquettes sont transparentes.

Voici un bon lien vers l'interface utilisateur par défaut Nimbus: http://www.duncanjauncey.com/java/ui/uimanager/UIDefaults_Java1.6.0_11_Windows_2000_5.0_Nimbus.html

+0

Oui - c'est * exactement * ce que j'ai essayé et cela n'a pas fonctionné. Cependant, je suis en train d'utiliser Scala, pas Java, alors j'ai décidé de lancer un test rapide en Java et cela a fonctionné. Donc merci. Malheureusement, je ne sais pas pourquoi cela ne fonctionne pas dans Scala! –

+0

Même si je ne connais pas grand-chose à Scala, je ne vois pas pourquoi cela ne devrait pas fonctionner. Swing Swing, même à Scala. –

+0

C'est en fait 'if (row% 2 == 1) {'. – cimnine

Questions connexes