2017-02-11 4 views
0

Ich versuche, die Farbe einiger Zellen in meiner JTable zu ändern. Ich habe versucht, GetTableCellRendererComponent in einem einfachen Beispiel zu überschreiben, und es funktioniert gut. Aber wenn ich das gleiche tun in meinem Projekt ändert sich nichts ...Farbe ändern JTable-Zellen mit getTableCellRendererComponent NOTHING HAPPENDS

Ich habe meine JPanel mit meinem JTable in einer Box wie folgt aus:

boxTable=Box.createHorizontalBox(); 
box2Table.add(boxTable); 

//JTable      
tablaContador = new JTable(datosContador,cabeceraContador); 

//MODIF COLOR 
tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

tun:

System.out.println(tablaContador.getColumnClass(3)); 

Ich weiß, kann dass der erste Parameter von setDefaultRenderer ist Object.class Ich weiß nicht, ob das Problem hier ist ... Ich habe nur Zeichenfolgen in der Tabelle, aber ich habe versucht String.class und nichts passiert

Ändern Sie dann ich einige Dinge von JTable der Zellen:

tablaContador.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
boxTable.add(tablaContador); 


//Align cells 
for (int i=0; i<cabeceraContador.length;i++){ 
tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
       } 

//Modify cells' width 
tablaContador.getColumnModel().getColumn(0).setMinWidth(150); 
for (int i=1; i<cabeceraContador.length;i++){ 
    tablaContador.getColumnModel().getColumn(i).setMaxWidth(40); 
} 

//Scroll for the Table 
scrollContador=new JScrollPane(tablaContador,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

scrollContador.setPreferredSize(new Dimension(1000,80)); 
scrollContador.setMinimumSize(new Dimension(1000,80)); 
scrollContador.setMaximumSize(new Dimension(2000,80)); 

//Add scroll to the box   
box2Table.add(scrollContador); 

Und meine ColorRenderer Klasse:

public class ColorRenderer extends DefaultTableCellRenderer{ 

    private Component c; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) { 

     c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 


     c.setBackground(Color.BLUE);    


     return c; 
    } 


} 

Table result

Es ist also nicht in meinem Projekt arbeiten, ich weiß nicht, warum

eine Idee?

thaks!

+1

Für beste Hilfe, bitte eine gültige [MCVE]/[SSCCE] (http://sscce.org in Ihrer Frage die Erstellung und Buchung in Erwägung ziehen,). Dies macht wirklich einen großen Unterschied darin, dass wir Ihren Code und Ihre Frage vollständig verstehen können. –

+0

Diese Frage wurde ursprünglich als Duplikat geschlossen von: http://stackoverflow.com/questions/18253881/custom-tablecellulenderer-treetablecellulenderer-doesnt-render-table-cells. Ich glaube nicht, dass es ein Duplikat ist, da dieser Renderer den DefaultTableCellRenderer (der undurchsichtig ist) "erweitert", während die andere Frage den TableCellRenderer "implementiert". In diesem Fall müssen Sie sich darum sorgen, das Label undurchsichtig zu machen. – camickr

+1

@HovercraftFullOfEels, 'Machen Sie Ihren benutzerdefinierten Renderer undurchsichtig ... standardmäßig nicht ', - ist der DefaultTableCellRenderer standardmäßig opak. – camickr

Antwort

2

Ich sehe:

tablaContador.setDefaultRenderer(Object.class, new ColorRenderer()); 

und dann sehe ich:

for (int i=0; i<cabeceraContador.length;i++) 
{ 
    tablaContador.getColumnModel().getColumn(i).setCellRenderer(alinearCeldas); 
} 

Die Zuordnung des Renderers auf eine bestimmte Spalte hat Vorrang vor den Standard-Renderer Einstellung so Ihre Farbe Renderer nie verwendet wird.

Nicht genau, was Sie versuchen zu tun, aber ich würde vermuten, dass Sie die Farbwiedergabe-Logik zum Alignment-Renderer hinzufügen müssen. Mit anderen Worten, die gesamte Rendering-Logik muss in einem einzelnen Renderer enthalten sein. Sie können mehrere Renderer nicht zusammenführen.

Hier ist ein einfaches Beispiel für eine benutzerdefinierte Renderer:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableRenderer extends JPanel 
{ 
    public TableRenderer() 
    { 
     String[] columnNames = {"String", "Integer"}; 
     Object[][] data = 
     { 
      {"A", new Integer(1)}, 
      {"B", new Integer(2)}, 
      {"C", new Integer(10)}, 
      {"D", new Integer(4)} 
     }; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 

     // Override default renderer on a specific column 

     TableCellRenderer colorRenderer = new ColorRenderer(); 
     table.getColumnModel().getColumn(1).setCellRenderer(colorRenderer); 
    } 

    /* 
    ** Color the focused cell 
    */ 
    class ColorRenderer extends DefaultTableCellRenderer 
    { 
     public ColorRenderer() 
     { 
      super(); 
      setHorizontalAlignment(JLabel.RIGHT); 
     } 

     @Override 
     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      if (isSelected) 
       setBackground(table.getSelectionBackground()); 
      else 
      { 
       setBackground(null); 

       try 
       { 
        int number = Integer.parseInt(value.toString()); 

        if (number > 9) 
         setBackground(Color.RED); 
       } 
       catch(Exception e) {} 
      } 

      return this; 
     } 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Color Renderer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableRenderer()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

Danke mein Freund! Das war der Punkt ...jetzt ist behoben – pctripsesp