noch ein rendererversuch

Status
Nicht offen für weitere Antworten.

McSnoop

Bekanntes Mitglied
Code:
.......

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
 if(hasFocus)
    setBackground(colorFocus);
 else is(colorSelected)
    setBackground(colorSelected);
 else
    setBackground(colorNormal);

if(value instanceof Boolean){
  table.setValueAt(new Boolean(true),row,column);
}else
if(value instanceof Integer){
  table.setValueAt(new Integer(value.toString()),row,column);
}else
if(value instanceof Double){
  table.setValueAt(new Double(value.toString()),row,column);
}else
if(value instanceof String){
  setText(value.toString());
}

return this;
}

.......


Da klemmts die ganze zeit schon und ich resignier hier bald.

Warum klappen nur Strings?? value ist doch ein Object warum kann ich ihn auf die zelle nicht wieder nen Object zurückgeben??

Der Haken ist nur das dies nicht so funktioniert. Das ergibt irgendwie ne Endlosschleife. Fehler werden keine ausgegeben.
 
B

Beni

Gast
Wieso:
Code:
if(value instanceof Boolean){
  table.setValueAt(new Boolean(true),row,column);
? Was bezweckst du damit? Wenn du die Einträge ändern willst, musst du einen TableCellEditor implementieren.

Dies erzeugt die Endlosschleife: denn table.setValue verändert das TableModel, welches wiederum für ein Neu-Zeichnen der Tabelle sorgt, welche dann den Renderer aufruft, ...

Versuch mal was wie:
Code:
if(value instanceof Boolean){
  setText( "Das ist jetzt ein Boolean: " + value );
Nur um zu schauen, ob die richtige if-Bedingung genommen wird.
 

McSnoop

Bekanntes Mitglied
ich dachte wenn ich :

Code:
if(value instanceof Boolean){ 
  table.setValueAt(new Boolean(true),row,column);

schreibe dann setzt mir der renderer neben den farben(hintergrund, selected und focus) auch wieder den Inhalt der in der Zelle war hin und indem fall ist es eine Checkbox.

also gibt der renderer "immer" nur string zurück????

also kann ich den renderer auch nur für die Strings anwenden.

gut wenn ich für die Checkboxen (Boolean Werte) nen TableCellEditor brauche, dann brauch ich für die Integer und Double werte auch nen TableCellEditor oder ??

Dann muss ich aber das mit den Farben setzen(hintergrund, selected und focus) auch in den TableCellEditor packen oder??
 

McSnoop

Bekanntes Mitglied
Code:
if(value instanceof Boolean){
  setText( "Das ist jetzt ein Boolean: " + value );
Nur um zu schauen, ob die richtige if-Bedingung genommen wird.

Die If bedingungen sind die richtigen und bei der jeweiligen spalte geht er auch in die richtige If Anweisung.
 
B

Beni

Gast
Der Renderer gibt eine Component zurück, welche das Object "value" in irgendeiner Form darstellt.

Anders gesagt: die Methode "getTableCellRendererComponent" muss aufgrund all der Eingaben entscheiden, welche Component den Wert darstellen soll.
Normalerweise entscheidet dies bereits die JTable, indem sie für jede Spalte einen bestimmten Renderer wählt, der immer dieselbe Componente zurückgibt.
Du kannst aber auch ein Renderer schreiben, der für jede Zelle einzeln entscheidet, welche Component benutzt werden soll:

Also du könntest hier sowas machen:
Code:
public class Renderer implements TableCellRenderer{
  private JLabel label = new JLabel();
  private JCheckBox box = new JCheckBox();

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
    if( value instanceof Boolean ){
      box.setSelected( ((Boolean)value).booleanValue() );
      return box;
    }
    else{
       label.setText( value.toString() );
       return label;
    }
  }
}

(wobei ich hier Hintergrundfarben etc. nicht hingeschrieben habe, aber die müssten auch noch gesetzt werden!)


Und ja: ein TableCellEditor ist grösstenteils eine Kopie eines TableCellRenderers. Schreib zuerst den Renderer, nachher kannst du dir immer noch Gedanken zum Editor machen :wink:
 

McSnoop

Bekanntes Mitglied
Beni hat gesagt.:
Der Renderer gibt eine Component zurück, welche das Object "value" in irgendeiner Form darstellt.
...
Normalerweise entscheidet dies bereits die JTable, indem sie für jede Spalte einen bestimmten Renderer wählt, der immer dieselbe Componente zurückgibt.
Du kannst aber auch ein Renderer schreiben, der für jede Zelle einzeln entscheidet, welche Component benutzt werden soll:

schon mal thx für deine posts.

zeilenweise möchte ich das nicht entscheiden sondern halt nur das trotz des farblich machens immer das component dargestellt wird was auch vorher in der zelle war und das ist ja pro spalte immer das gleiche component.

wenn die JTable schon selber einen passenden Renderer wählt kann man dem nicht sagen mache die zelle farbig??

die richtige komponente fügt wenn ich dich richtig verstanden habe der entsprechende renderer dann selber ein, weil der ja an die spalte gebunden ist.

JTable Struktur ist:

Boolean|Boolean|Integer|String|Integer|Integer|Double|Integer|Integer

im Model bei setValueAt habe ich das alles so geschrieben das entsprechend nur das eingetragen werden kann was auch zulässig ist. Meinst du die JTable entscheidet das an der stelle??
 
B

Beni

Gast
McSnoop hat gesagt.:
zeilenweise möchte ich das nicht entscheiden sondern halt nur das trotz des farblich machens immer das component dargestellt wird was auch vorher in der zelle war und das ist ja pro spalte immer das gleiche component.

wenn die JTable schon selber einen passenden Renderer wählt kann man dem nicht sagen mache die zelle farbig??
Die Farbe kannst du nur ändern, wenn du Zugriff auf diesen Renderer hast, aber das ist nur dann der Fall, wenn du ihn selbst implementierst.
Wie auch immer, einen grossen Teil kannst du ja aus den bereits vorhandenen Renderern kopieren (der Quellcode ist beim JDK dabei).

im Model bei setValueAt habe ich das alles so geschrieben das entsprechend nur das eingetragen werden kann was auch zulässig ist. Meinst du die JTable entscheidet das an der stelle??

Die JTable entscheidet aufgrund der Rückgabewertes von "getColumnClass" aus dem TableModel, welcher Renderer (und auch welcher Editor) verwendet wird. Der Renderer stellt nur einzelne Zellen dar, verändert sie aber nicht. Daher hat er keinen Einfluss auf das, was eingetragen werden kann.
Anders der Editor: er bekommt ein Wert, verändert ihn, und gibt einen neuen Wert zurück (der in das TableModel eingetragen wird). Da der Editor ein Object zurückgeben muss (es wird nämlich die Methode "getCellEditorValue()" benutzt), kann der Editor entscheiden, was in das TableModel eingetragen wird.
Die normalen Editoren liefern das zurück, was sie gekriegt haben, also Boolean -> Boolean, Double -> Double,... und wenn sie eine Klasse nicht kennen, bekommt man einen String (im Sinne von "besser als gar nichts").
 

McSnoop

Bekanntes Mitglied
THX THX

ich habe jetzt das getColumnClass einfach mal angepasst:

Code:
public Class getColumnClass(int columnindex){
 if((columnindex==2)||(columnindex==4)||(columnindex==5)||(columnindex==7)||(columnindex==8)){
    return Integer.class;
  }else
 if(columindex==6){
    return Double.class;
  }else
  if(columnindex==0)||(columnindex==1){
    return Boolean.class;
  }else 
  if(columnindex==3){
    return String.class;
  }
  
  return xxxxxxx;    <-------

}

getColumnClass geht nur wenn ich bei <-------- ein return zurückgebe. Nehme ich diese Zeile raus bringt er einen fehler. Aber die zeile muss doch wech, weil ich doch darüber jeweils für die entsprechende Spalte ein return gebe.

warum will er da unten ein return haben??
 

Wildcard

Top Contributor
Es muss in jedem Fall ein return ausgeführt werden.
Wenn du jeden möglichen Fall abgefangen hast kannst du dein letztes if entfernen.
Dann brauchst du auch das letzte return nicht:

Code:
public Class getColumnClass(int columnindex){ 
if((columnindex==2)||(columnindex==4)||(columnindex==5)||(columnindex==7)||(columnindex==8)){ 
    return Integer.class; 
  }else 
if(columindex==6){ 
    return Double.class; 
  }else 
  if(columnindex==0)||(columnindex==1){ 
    return Boolean.class; 
  }else 
    return String.class; 

}

Falls es irgendwie passieren kann das keine der Bedingungen erfüllt ist, lässt du das letzte if und das letzte
return trotzdem drin, und gibtst bspw. 'null' zurück.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
B Lottospielen mit System, Versuch 2, noch umständlicher als vorher Allgemeine Java-Themen 1
berserkerdq2 Wozu schreibe ich 3 und 1 noch hin? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
R JDK installieren Gibt es ab 2019 überhaupt noch Java? Allgemeine Java-Themen 6
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
J Could not convert socket to TLS - gestern liefs noch Allgemeine Java-Themen 2
H Wie kann ich überprüfen ob das Feld noch frei ist? Allgemeine Java-Themen 5
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
R Seleium / WebDriver findet weder URL noch Title Allgemeine Java-Themen 1
HarleyDavidson Was ist das? Noch nie gesehen... Allgemeine Java-Themen 3
B Input/Output Datei noch geöffnet trotz Close Allgemeine Java-Themen 4
A Noch eine Frage zur Methode matches() Allgemeine Java-Themen 2
J Lebt das Objekt noch?? Allgemeine Java-Themen 12
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
I Exceptions - weder catch- noch finally-Klausel funktioniert Allgemeine Java-Themen 12
J Rekursive Methode und if-Blöcke, was wird noch ausgeführt? Allgemeine Java-Themen 2
D Brauche mal Hilfe bin noch nicht so fit Allgemeine Java-Themen 3
Y Mal wieder vergleichen von Strings.[Leider noch ein Problem] Allgemeine Java-Themen 18
S Zeichen, dass Programm noch läuft Allgemeine Java-Themen 3
G Sind Applets noch uptodate Allgemeine Java-Themen 24
G Aufruf einer Methode wenn Klasse noch nicht existiert Allgemeine Java-Themen 3
A Noch freie Nummern anzeigen lassen Allgemeine Java-Themen 3
J Immer noch OpenOffice.org - Malheur Allgemeine Java-Themen 4
A Warum hab ich noch nie ein .jar Archiv gesehen? Allgemeine Java-Themen 5
T Geht das vielleicht noch einfacher? Allgemeine Java-Themen 7
G Java Cryptography Extension (JCE) mit Java 1.6 noch aktuell? Allgemeine Java-Themen 1
P Source code verloren habe nur noch kompilierte .jar. Allgemeine Java-Themen 12
E Nach Packen in Jar ist Sound nur noch abgehackt zu hören Allgemeine Java-Themen 2
F JSP noch aktuell? Allgemeine Java-Themen 5
Ark Noch mal Fourier Allgemeine Java-Themen 2
S Prozess javaw.exe läuft immer noch, obwohl Programm beendet Allgemeine Java-Themen 6
G Was soll noch alles in Java kommen? Allgemeine Java-Themen 14
B Noch einmal Kopierschutz, sorry Allgemeine Java-Themen 7
G nur noch 2 kleinigkeiten dann bin ich glücklich^^ Allgemeine Java-Themen 2
M Kann man hier noch was rausholen? Allgemeine Java-Themen 16
flashfactor Testen ob ein R/3 erreichbar bzw. noch am leben ist. Allgemeine Java-Themen 2
D Laufen meine alten progs auf java 5 noch? Allgemeine Java-Themen 7
D Threads wollen weder schlafen noch aufgewckt werden! Allgemeine Java-Themen 6
C Was geht noch? Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben