2017-06-13 6 views
-1

Ich habe eine Tabelle in Java, die den Inhalt von Verzeichnissen enthält. Ich habe 5 ComboBoxes erstellt, die den Benutzer in Ordnern navigieren und dann eine JTable mit dem Inhalt des ausgewählten Ordners, wie Dateiname, Datum, Ersteller usw. erstellen. In der 6. Spalte der Tabelle habe ich einige String-Werte und abhängig von jedem Wert Ich möchte die Hintergrundfarbe dieser Zelle ändern. Hier ist die letzte ComboBox, in der ich die JTable starte.Ändern Sie die Hintergrundfarbe der Zelle auf dynamische JTable

+1

Schnellhinweis: 'catch (Nullpointer n) {}'?Sie sollten nie eine NPE fangen, und dies deutet darauf hin, dass Sie mit diesem Code etwas ernsthaft falsch machen. –

+2

Wenn Sie weitere Hilfe benötigen, sollten Sie ein gültiges [mcve], ein neues kleines Programm, das in Ihrer Frage als Code-formatierter Text geschrieben wurde, erstellen und veröffentlichen. –

+2

Ich sehe jetzt, dass ein MCVE in Ihrer [vorherige unbeantwortete Frage] angefordert wurde (https://stackoverflow.com/questions/44279125/add-selected-data-from-jtable-to-lst-file), aber dass Sie nie eine (wie Sie nicht hier). Bitte ignorieren Sie diese Anfragen nicht, wenn Sie eine anständige Antwort auf Ihre Fragen wünschen. Wir bitten diese Informationen aus einem bestimmten Grund - damit wir Ihren Code, Ihr Problem und Ihre Frage vollständig verstehen können. –

Antwort

3

Sorry, um ehrlich zu sein, aber Ihr Versuch, NPE catch(NullPointerException n){} zu fangen - ist so sehr falsch - nie dies tun, sondern beheben Sie stattdessen die Fehler, die die NPE verursachen könnte.

Wie für Ihr Problem, überlasten Sie nicht die tatsächliche Methode. Ihre Methode Unterschrift:

public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

entspricht nicht der tatsächlichen Methode Signatur:

public Component prepareRenderer(TableCellRenderer renderer, 
          int row, 
          int column) 

gemäß dem JTable API, Ihnen fehlt die 3. Parameter, die Spalte int Parameter.

Deshalb sollten Sie immer überschreiben Methoden mit der @Override Annotation voranstellen. Hätten Sie das getan:

@Override // this will cause the compiler to complain that this isn't an override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

Und Ihre for-Schleife in dieser Methode sieht ziemlich suspekt. Ich würde es loswerden, da der Renderer nur die Zelle rendern sollte, die durch die Zeilen- und Spaltenindizes angegeben ist.

zB

DefaultTableModel listModel = new DefaultTableModel(); 
JTable table1 = new JTable(listModel){ 

    @Override // don't forget this! 
    public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) { 
     JComponent component = (JComponent) super.prepareRenderer(renderer, i, columnIndex); 
     int lastRow = listModel.getRowCount(); 
     // this will likely set the whole row. If you only want to set only a specific cell, then 
     // you'll need to first check the columnIndex. 
     if (getValueAt(rowIndex, 6).toString().contains("yellow")) { 
      component.setBackground(Color.RED); 
     } else { 
      component.setBackground(null); // turn color back to default 
     } 
     return component; 
    } 
}; 
3

Sie sollten nicht verlängern JTable aber DefaultTableCellRenderer und festgelegt, dass als Standard-Renderer in Ihrer Tabelle:

public class TableRendererExample { 
    public static void main(String[] args) { 
     TableCellRenderer renderer = new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
        boolean hasFocus, int row, int column) { 
       Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       rendererComponent.setBackground("value2".equals(value)?Color.RED:Color.WHITE); 
       return rendererComponent; 
      } 
     }; 
     TableModel tableModel= new DefaultTableModel(10, 3){ 
      @Override 
      public Object getValueAt(int arg0, int arg1) { 
       return "value"+new Random().nextInt(4); 
      }  
     }; 
     JTable jTable = new JTable(tableModel); 
     jTable.setDefaultRenderer(Object.class, renderer); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
} 


wahrscheinlich dies ist ein bessere langfristige Lösung, da es auch das OP erlaubt um den CellRenderer für eine bestimmte Spalte festzulegen. - Hovercraft Full Of Eels

Noch besser Sie brauchen nicht auf den Spaltenindex im Voraus zu wissen, wann Sie überschreiben getColumnClass() in TableModel:

gleiche Renderer Klasse für alle Spalten:

class DefaultTableCellRendererBackground extends DefaultTableCellRenderer { 
    private final Color highlightColor; 

    DefaultTableCellRendererBackground(Color highlightColor) { 
     this.highlightColor = highlightColor; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, 
       column); 
     rendererComponent.setBackground(highlightColor); 
     return rendererComponent; 
    } 
} 

TableModel gibt für jede Ausführung verschiedene ColumnClasses zurück:

final class DefaultTableModelExtension extends DefaultTableModel { 
    private final List<Class<?>> columnClass; 

    DefaultTableModelExtension(int rowCount, int columnCount, List<Class<?>> columnClass) { 
     super(rowCount, columnCount); 
     this.columnClass = columnClass; 
     Collections.shuffle(this.columnClass); 
    } 

    @Override 
    public Class<?> getColumnClass(int col) { 
     return columnClass.get(col); 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     return "value" + new Random().nextInt(4); 
    } 
} 

Typen t o zurückgegeben werden:

interface TagRed {} 

interface TagBlue {} 

interface TagYellow {} 

Nutzung (Laufmehrfach ...):

public class TableRendererExample { 
    public static void main(String[] args) { 
     JTable jTable = new JTable(); 
     jTable.setDefaultRenderer(TagRed.class, new DefaultTableCellRendererBackground(Color.RED)); 
     jTable.setDefaultRenderer(TagBlue.class, new DefaultTableCellRendererBackground(Color.BLUE)); 
     jTable.setDefaultRenderer(TagYellow.class, new DefaultTableCellRendererBackground(Color.YELLOW)); 

     List<Class<?>> columnClass = Arrays.asList(TagRed.class, String.class, TagBlue.class, TagRed.class, String.class, 
       TagYellow.class, TagBlue.class); 
     jTable.setModel(new DefaultTableModelExtension(10, columnClass.size(), columnClass)); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
} 
Verwandte Themen