Swing CellRenderer für einzelne Zellen?

Lil_Ber

Mitglied
Hallo 🙂

Ich habe ganz viele Probleme mit dem CellRenderer und dafür ganz wenig Ahnung 😀

Folgendes Vorhaben:

Ich habe eine JTable und einen Wert int row und einen Wert int col. Nun möchte ich einen CellRenderer implementieren. Dieser soll nur in der Zelle row / col die Backgroundfarbe ändern.
Die JTable ist in einer anderen Klasse implementiert als int row und int col berechnet wird - denn das geschieht in einer anderen Klasse.

Wo muss ich den CellRenderer implementieren? Und wie geht das?
Bisher habe ich das so versucht:


Code:
public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("a")){
            int row=(comp.getFarbe().getText());
            int col=(comp.getWand().getText());   
   
            JTable table = c.getTable();
                   
            TableCellRenderer ren = new ColoredTableCellRenderer();
            table.setDefaultRenderer( GUI.class, ren );


und die andere Klasse, in der die JTable implementiert ist:

Code:
String[][] data = {
                {
                { "1", "2", "3", "4" },
                { "a", "b", "c", "d" },
               
        };

        String[] columnNames =  {
                "wanda", "wandb", "wandc", "wandd"
        };

JTable table = new JTable();
 
Das erste Argument in table.setDefaultRenderer steht für den Datentyp, den der Renderer verarbeiten kann. Wenn du deinen Renderer für alle Datentypen verwenden möchtest, sollte da Object.class stehen.
Ansonsten sieht das ganze nicht so falsch aus. Woran hakt es denn konkret?
 
entschuldige die späte antwort.
es hakt daran, dass ich nicht weis wie ich eine konkrete zelle ansteuern kann.

Ich möchte irgendwo row = 1 übergeben und col = 2 (zum beispiel) und dann soll der cellrenderer nur die Zelle 1,2 den hintergrund ändern
 
Das TableCellRenderer-interface definiert ein Methode
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
die von allen implementierenden Klassen mit Leben gefüllt werden muss. In der Parameterliste tauchen auch der Spalten- und Zeilenindex auf.
Wie sieht denn der Quälcode von ColoredTableCellRenderer aus?
 
Den habe ich noch nicht, das genau ist der Punkt wo ich nicht weiterkomme...mir ist auch nicht klar, wo ich den implementieren muss. Muss ich dafür eine eigene Klasse erstellen oder kommt der direkt beim actionListener rein?
Ich habe mir so etwas in der Art gedacht
Code:
class ColoredTableCellRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column){
            
       
   
        if(row==1&&column==1){
           
            Color selectionBackground = Color.BLACK;
            table.setSelectionBackground(selectionBackground);
            table.setValueAt(selectionBackground, row, column);
       
        }
       
        }
    
    
    
        return table;
    
    }

Hier kommt zwar keine Fehlermeldung aber die Zelle wird nicht verfärbt, auch wenn direkt über der if-Schleife row und col = 1 setze...
 
Zuletzt bearbeitet:
Muss ich dafür eine eigene Klasse erstellen oder kommt der direkt beim actionListener rein?
Zunächst mal musst du verstehen, wie ein TableCellRenderer funktioniert. Dann kannst du dir über den Rest Gedanken machen.
Ein TableCellRenderer dient dazu, den Inhalt einer Tabellenzelle zu visualisieren. Per default wird dazu eine Instanz von DefaultTableCellRenderer verwendet, der seinerseits JLabel erweitert. In der getTableCellRendererComponent-Methode von DefaultTableCellRenderer wird als Rückgabewert this verwendet, d. h. die DefaultTableCellRenderer Instanz gibt sich selbst zurück. Vorher formatiert sie sich basierend auf den Argumenten der getTableCellRendererComponent-Methode und setzt bei sich einen Text, der aus der toString()-Methode des übergebenenen value besteht.
Der return-Wert von "table" in deinem Beispiel ist Unsinn. Ausserdem überschreibst du im Renderer den Wert in der Tabelle.
Hier http://www.java2s.com/Tutorial/Java/0240__Swing/implementsTableCellRenderer.htm gibt es ein Beispiel für einen Renderer der Zellen färben kann. Sehr nachteilig an diesemn Beispiel ist, dass bei jedem Aufruf von getTableCellRendererComponent eine neue Instanz von JTextField erzeugt wird. Aber als Einführungsbeispiel um zu sehen wie ein Renderer grundsätzlich funktioniert sollte das erstmal reichen.
 

Neue Themen


Zurück
Oben