2014-09-05 3 views
0

J'utilise le code suivant pour définir la couleur alternative de la ligne de fond dans un jtable:Impossible de définir la couleur d'arrière-plan personnalisé dans jtable

table = new JTable(model); 
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
{//alternate background color for rows 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     if (!isSelected) 
      c.setBackground(row % 2 == 0 ? Color.white : Color.lightGray); 
     return c; 
    }; 
}); 

Et il fonctionne. Cependant, je voudrais utiliser une couleur personnalisée dire rgb (242.242.242) à la place de GrisClair comme la couleur alternative, mais en faisant:

final Color alternateColor = new Color (242,242,242); 
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
{//alternate background color for rows 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     if (!isSelected) 
      c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
     return c; 
    }; 
}); 

la couleur alternative est complètement ignorée et toutes les lignes ont un fond blanc. Il semble que cette méthode ne fonctionne qu'avec les couleurs appartenant à l'énumération des couleurs. Comment vient?

Voici un exemple de travail complet suivi de l'écran résultant:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import javax.swing.*; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class Test extends JFrame 
{ 
private JTable    table    = null; 
private Object[]   columnTitle = { "Column1", "Column2", "Column3" }; 
private Object[][]   data    = null; 
private DefaultTableModel model    = null; 
private JPanel    panel    = null; 
private JScrollPane  scroller   = null; 

public Test() 
    { 
     super(); 
     setLayout(new BorderLayout()); 
     panel = new JPanel(); 
     scroller=new JScrollPane(); 
     data = new Object[3][3]; 

     for (int i=0; i<3; i++) 
      { 
       for (int j=0; j<3; j++) 
        { 
         data [i][j]="Test"; 
        } 
      } 

     model = new DefaultTableModel(data, columnTitle); 
     table = new JTable(model); 
     final Color alternateColor=new Color(242,242,242); 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
     {//alternate background color for rows 
        @Override 
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
          boolean hasFocus, int row, int column) 
         { 
          Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
          if (!isSelected) 
           c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
          return c; 
         }; 
       }); 

     scroller.setViewportView(table); 
     panel.add(scroller); 
     this.add(panel, BorderLayout.CENTER); 
    } 

public static void main(String[] args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
       { 
        Test test = new Test(); 
        test.setLocationRelativeTo(null); 
        test.pack(); 
        test.setVisible(true); 
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       } 
     }); 
    } 
} 

enter image description here

Et voici l'écran avec Color.lightGray: enter image description here

+2

Non, ça marche très bien pour moi. Envisagez de fournir un [exemple exécutable] (https://stackoverflow.com/help/mcve) qui illustre votre problème. Cela se traduira par moins de confusion et de meilleures réponses – MadProgrammer

+0

Eh bien, si cela fonctionne pour vous, c'est probablement lié à la LAF que j'utilise qui est Weblaf. Je ne vois aucune autre raison possible ... – Zek101

+0

Mais le premier exemple fonctionne avec weblaf? – MadProgrammer

Répondre

1

fonctionne bien pour moi ..

Test

import com.alee.laf.WebLookAndFeel; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TestTable { 

    public static void main(String[] args) { 
     new TestTable(); 
    } 

    public TestTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       WebLookAndFeel.install(); 

       DefaultTableModel model = new DefaultTableModel(new Object[]{"Test"}, 10); 
       JTable table = new JTable(model); 
       final Color alternateColor = new Color(255, 0, 255); 
       table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {//alternate background color for rows 
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
         Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
         if (!isSelected) { 
          c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
         } 
         return c; 
        } 
       }); 
       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

Il est possible qu'un autre rendu a pris four, que la table de votre réglage du générateur de n'est pas celui qui est à l'écran ... tant d'autres facteurs que runnable example qui démontre votre problème serait elimnate.

+0

Merci beaucoup, j'ai édité le post avec un exemple exécutable et une capture d'écran. – Zek101

+0

Désolé pour le dérangement et merci pour votre aide @MadProgrammer. Enfin, il semble que le problème était lié à ma fatigue oculaire et non au code;) – Zek101

2

L'approche consistant à surcharger le moteur de rendu ne fonctionne que si vous avez des données (c.-à-d. String) qui utilise le moteur de rendu par défaut dans toutes vos colonnes. Que faire si vous avez des données Date ou Numéro dans votre table qui nécessitent des moteurs de rendu différents?

Dans ce cas, vérifiez Table Row Rendering pour une solution qui fonctionne pour tous les types de données.

Ou peut-être vous pouvez utiliser:

UIManager.put("Table.alternateRowColor", Color.YELLOW); 

Je ne sais pas si cette propriété fonctionne sur tous les LAF de.

+0

Merci pour l'information camickr! Cependant, comme mentionné dans le commentaire ci-dessus: après plusieurs essais, il s'est avéré être un bug situé entre la chaise et l'écran et pas lié au code après tout;)) – Zek101

+0

@ Zek101, je comprends. J'essayais juste de montrer des solutions plus flexibles pour vous ou pour d'autres qui lisent ceci. – camickr

+0

merci beaucoup, j'apprécie. – Zek101

Questions connexes