 |
JTable: Problem mit CellRenderer
|
|
On Thu, 3 Jul 2008 02:49:46 -0700 (PDT), Uwe Naumann <...@web.de
Hallo allerseits,
ich habe eine JTable mit eigenem Model sowie eigenen CellRenderern und
einem CellEditor für eine Spalte (Checkbox für aktiv ja/nein). Bei
Änderungen der Checkbox wird dies ans TableModel durchgereicht.
Nun wollte ich gern inaktive Zeilen in der Tabelle farblich anders
hinterlegen, was generell auch via CellRenderer kein Problem ist. Nur
wie komme ich innerhalb der CellRenderer elegant an die entsprechenden
steuernden Daten aus dem TableModel? Momentan mache ich das via
boolean isActive = Boolean.valueOf(table.getModel().getValueAt(row,
5).toString());
wobei die 5 die entsprechende Spalte im TableModel für die Aktiv-Info
ist.
Geht das auch eleganter? Vor allem stört mich die feste Verdrahtung
der Bezugsspalte. Ok, das könnte man noch via Konstante lösen, aber so
richtig zufrieden bin ich damit auch nicht.
Bin ich auf dem falschen Lösungsweg?
Gruß Uwe
|
Calendar / Date und Zeitzonen
[04 Sep 2008]
On Thu, 04 Sep 2008 07:43:27 +0200, Karsten Stöckmann <ngc2997@gmx.net
Hej,
folgendes...
Problem:
ich habe zwei Werte w1 und w2 (Calendar), deren Zeitzone GMT+0 ist. Nun
möchte...
|
Literatur Debug (Memory leak)
[03 Sep 2008]
On Wed, 3 Sep 2008 06:21:23 -0700 (PDT), Oliver Nass <oliver.nass@gmx. de
Hallo Leute,...
ich habe in meiner Webanwendung einen Memory leak. Mit dem Tool
HPJmeter sieht man schön...
|
Java Middleware
[29 Aug 2008]
On Fri, 29 Aug 2008 08:18:25 -0700 (PDT), Gidion <exit.lunar@googl email.com
Hallo,
ich...
ich bin gerade auf der Suche nach Java Middleware Technologien.
bevorzugt suche ich welche...
|
| More... |
|
|
|
 |
On Thu, 3 Jul 2008 03:10:58 -0700 (PDT), Paul Schwann <...@gmail.com
Hi Uwe,
Du könntest Dein eigene Tabellen-Model implementieren, welches dann
eine entsprechende Methode #isActive(in row) hat. Im Renderer müsstest
Du dann ungefähr folgendes tun:
...
boolean active = ((MyTableModel) table.getModel()).isActive(row);
...
Vielleicht hilft's ...
Gruß,
Paul
|
 |
On 3 Jul., 12:10, Paul Schwann <...@gmail.com
Habe ich ja schon.
Ja, das Ganze primär im TableModel abzuhandeln macht das Ganze
zumindest lesbarer.
Gruß Uwe
|
 |
On Fri, 04 Jul 2008 17:22:16 +0200, Joachim Lippold <...@icqmail.com
Hallo,
Wenn man elegant vom CellRenderer auf die Modellobjekte zugreifen will,
dann muss man bereits beim TableModel ansetzen.
Wenn ich mich nicht irre, dann repräsentiert in deiner Tabelle ein
Objekt eine ganze Zeile. Die Splaten zeigen dann wieder Eigenschaften
dieses Objektes wie z.B. isActive() oder getName() usw.
Demzufolge sollte das TableModel bei getValuAt(row,column) nicht den
Anzeigewert zurückgeben, sondern das Modellobjekt und die Spalten
einfach ignorieren.
Das Extrahieren und Anzeigen der gewünschten Eigenschaften geschiet dann
über ein TableColumnModel. Dabei definiert dann wiederum jede
TableColumn welche Eigenschaft, sie vom Modellobjekt extrahieren und
editieren will. Für eine TableColumn muss man also einen
TableCellRenderer und TableCellEditor definieren, der dann die
gewünschte Eigenschaft bearbeitet / anzeigt.
Der TableCellRenderer hat dann auch schon Zugriff auf das richtige
Objekt, da bei getTableCellRendererComponent() nun bei value bereits das
Modellobjekt zurückgegeben wird und nicht der Anzeigewert.
((<ModellObjektfestzustellen, ob man momentan ausgegraut rendern muss.
Will man noch die Sortierfunktion nutzen, muss man noch für jede Spalte
einen Comparator anlegen und diese dann gekapselt in einem
TableRowsorter an die Tabelle übergeben.
Die Vorteile dieser Methode liegen dann später auf der Hand auch wenn
für die Anzeige erstmal mehr Aufwand betrieben werden muss.
Wenn man beispielsweise das gerade selektierte Objekt von der Tabelle
bekommen will reicht nun:
table.getValueAt(table.getSelectedRow(),0)
aus. Vorher war hierzu nötig:
((<Modellklasse
*Modellklasse musste die Methode getModelObject(int rowIndex) zusätzlich
bereitstellen
Wird dann noch ein RowSorter verwendet, wurde die Sache noch etwas
komplizierter, dann musste vorher noch eine IndexTransformation
stattfinden mit table.convertColumnIndexToModel(int index);
Ich habe übrigens das ganze in einer kleinen Demoapplikation mal
umgesetzt. Bei mir zeigt nun eine Spalte die Checkbox und 2 weitere Name
und Vorname.
Wird nun die Checkbox deselektiert, werden Name und Vorname über die
CellRenderer in grauer Schrift gezeichnet. Auch das Editieren jeder
Spalte funktioniert, wie es soll.
Wenn es von Interesse ist, kann ich diese kleine Applikation gerne im
Source Code zur Verfügung stellen. Dann kann man vorallem sehen wie die
CellRenderer und CellEditorern für spezifische Klassen der JTable
trotzdem weiter verwendet werden können.
z.B:
...
case PROPERTY_ACTIVE: setCellRenderer(new TableCellRenderer() {
final JTable table = new JTable();
public Component getTableCellRendererComponent(JTable table, Object
value, boolean isSelected, boolean hasFocus, int row, int
column) {
if (value instanceof DataObject)
value = ((DataObject)value).isActive();
return table.getDefaultRenderer(value.getClass())
.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
}
}); break;
...
Gruß Joachim
Uwe Naumann schrieb:
> Gruß Uwe
|
 |
On Wed, 09 Jul 2008 11:59:13 +0200, Alex <...@freenet.de
Hallo,
ich habe folgendes Problem. Ich habe ein ArrayList mit Objekten eines
Types "Trace". Ich gebe alle Objekte bzw. die Instanzen des Objectes
(alle als String) durch ein JTable auf dem Bildschirm aus. Die Daten
bekommt die Tabelle von einem entsprechenden TableModel (TableModelTrace).
Jetzt ist das Objekt hat zusätlzich noch ein ArrayList <Triggerbekommen. Ich will jetzt durch das Markieren der Zeile und
entsprechendem Auswahl in Pop-Up-Menu diese neue Liste in einem neuem
Fenster in einer JTable anzeigen.
Und ich was nicht wie ich an dieses Object "Trace" in der JTable ran
kommen kann um die entsprechende ArrayList<TriggerObject "Trace" gehört, für die neue Tabelle zu ermitteln.
Und sind die Ausschnitte aus der Code.
Geht das überhaupt? Muss ich eventuell das Konzept komplett ändern? Wie
konnte man das besser und ellegnater machen?
------------------------------------------
class Steuerung{
ArrayList<Trace// es gibt entspr. getter und setter
}
------------------------------------------
public class Trace implements Serializable {
private String traceDatum;
private String traceName;
private String vNummer;
private String iStufe;
private String tracePfad;
private ArrayList<Trigger private String bearbStatus;
.....
}
-------------------------------------------------------------------------------- ---------------------------
public class TableModelTrace extends AbstractTableModel {
/**Konstruktor der Klasse TableModelTrace
* @param steuerungObject Erwartet ein Object Klasse Stuerung um
die Daten von Traces zu bekommen
*
*/
public TableModelTrace(Steuerung steuerungObject) {
steuerung = steuerungObject;
}
private Steuerung steuerung;
public int getRowCount() {
ArrayList<Trace int anzZeilen = trListe.size();
return anzZeilen;
}
public int getColumnCount() {
return 5;
}
public Object getValueAt(int row, int column) {
ArrayList<Trace Trace einTrace = new Trace();
einTrace = traces.get(row);
if (column == 0) {
return einTrace.getTraceDatum();
} else if (column == 1) {
return einTrace.getTraceName();
} else if (column == 2) {
return einTrace.getVNummer();
} else if (column == 3) {
return einTrace.getIStufe();
} else {
ArrayList<Trigger triggerListe= einTrace.getTrigerListe();
Trigger ersterTrigger=triggerListe.get(0);
return ersterTrigger.getVerantwEntwickler();
}
}
}
|
 |
On Wed, 09 Jul 2008 13:20:39 +0200, Joachim Lippold <...@icqmail.com
Hallo Alex,
für eine saubere Lösung sollte das TableModel bei getValueAt()
unabhängig von der Spalte immer
...
return einTrace;
...
zurückgeben. Welche Werte eine Spalte dann aus dem Objekt extrahieren
soll, kann über ein TableColumnModel mit entsprechenden CellRenderer und
CellEditoren realisiert werden. table.getValueAt(row,column) gibt dann
immer das Trace Objekt zurück. Eine kleine Beispielapplikation hatte ich
zum ursprünglichen Thema mal angefertigt um das ganze auszutesten. Diese
kann ich gerne zur Verfügung stellen.
Wenns jdeoch schnell gehen soll, kann man folgendes probieren:
In der Klasse TableModelTrace die Methode getTrace(int rowIndex)
hinzufügen.
public class TableModelTrace extends AbstractTableModel {
...
public Trace getTrace(int index) {
return steuerung.getTraceListe().get(index);
}
...
}
Dann wie folgt:
Sei JTable table die Tabelle...
int row = table.getSelectedRow();
// Indextransformation nicht vergessen, sonst gibt es beim Einsatz von
// RowSorter später Probleme!
row = row==-1?row:table.convertRowIndexToModel(row);
if (row==-1) return; // keine Zeile selektiert
Trace trace = (Trace) ((TableModelTrace)table.getModel()).getTrace(row);
Gruß Joachim
Alex schrieb:
|
 |
On Wed, 09 Jul 2008 14:45:55 +0200, Alex <...@freenet.de
Hallo Joachim,
das sieht sehr gut aus. Ich glaube das ist das was ich brauche. Ich
werde gleich testen.
Vieeeeeeeeeeeeelen Dank!
Joachim Lippold schrieb:
>
|
|
|