Editierbare JTable Tutorial
Frage
Gibt es gute Bücher oder Website, die über die Schaffung eines JTable
gehen? Ich möchte eine Spalte bearbeitbar machen. Ich würde wirklich gerne eine vererbte JCheckBox
Komponente setzen (die wir hier geschaffen) in einer der Tabellenspalten, anstatt nur die Tabelle JCheckBox
in Basis stellen, die auf sie ein editierbares boolean
Feld zu sein.
Ich habe die JFC Swing-Tutorial Second Edition Buch, aber ich würde nur gerne wissen, ob es noch andere Beispiele sind ich und lernen aussehen könnte, wie man besser mit den Tabellen befassen. Das Buch scheint nur den Java ‚trail‘ zu nehmen online und steckt es in dem Buch.
Ich bin wieder zu lesen, das Zeug aber nur neugierig, wenn jemand etwas gefunden hat, die mehr könnte helfen.
Lösung
Um eine Spalte bearbeitbar zu machen haben Sie die isCellEditable
Methode in den TableModel
außer Kraft zu setzen. ein TableModel
zu schaffen, ist ziemlich einfach, wenn Sie AbstractTableModel
erben, und ich würde es für alle, aber die einfachsten JTable
s empfehlen.
Um jedoch die TableModel
Anpassung ist nur ein Teil von dem, was Sie tun müssen. Um tatsächlich eine benutzerdefinierte Komponente in der JTable
zu erhalten, müssen Sie eine benutzerdefinierte CellRenderers einzustellen. Um eine interaktive benutzerdefinierte Komponente zu verwenden, müssen Sie eine benutzerdefinierte Zelle Editor einzustellen. In einigen Fällen ist es genug für diesen leicht modificated Versionen der Standard-Klassen zu verwenden.
Herausgeber
Wenn Sie bereits eine eigene Komponente bekommen leicht mit Delegation getan: eine neue Klasse erstellen TableCellEditor
Implementierung und gibt eine neue Instanz der Komponente in dem getCellEditorComponent
Verfahren. Die paramaters dieses Verfahren umfassen den Stromwert sowie die Zellkoordinaten, eine Verbindung zurück zum Tisch und ob oder nicht die Zelle ausgewählt ist.
Die TableCellEditor
hat auch eine Methode, die aufgerufen wird, wenn der Benutzer eine Änderung an den Zelleninhalt verpflichtet (wo Sie Benutzereingaben und stellen Sie das Modell validieren) oder storniert bearbeitet. Achten Sie darauf, die stopEditing()
Methode auf Ihrem Editor aufrufen, wenn Sie jemals programmatisch Bearbeitung abbrechen, da sonst die Editor-Komponente auf dem Bildschirm bleiben - dies nahm mich einmal wie 2 Stunden debug
Beachten Sie, dass innerhalb von JTable
Editoren und nur Redakteure erhalten Ereignisse! eine Schaltfläche angezeigt kann mit einem Renderer erfolgen. Aber um eine funktionierende Taste zu erhalten, müssen Sie einen Editor mit dem richtigen EventListeners
registriert implementieren. Registrieren eines Zuhörers auf Renderer tut nichts.
Renderer
einen Renderer Der Implementierung ist nicht unbedingt notwendig für das, was Sie in Ihrer Frage beschreiben, aber Sie in der Regel sowieso tun es am Ende, wenn auch nur für geringfügige Änderungen. Renderer, anders als Redakteure, ist Geschwindigkeit entscheidend. Die getTableCellRendererComponent
eines Renderers einmal für jede Zelle in der Tabelle genannt wird! Die Komponente von einem Renderer zurückgegeben wird nur verwendet, um die Zelle zu malen, nicht für die Interaktion und kann somit für die nächste „wiederverwendet“ werden Zelle. Mit anderen Worten, sollten Sie die Komponente (zB mit setText(...)
oder setFont(...)
, wenn es eine TextComponent
ist) einstellen in den Renderer, sollten Sie nicht instanziiert ein neues Geschäft - das ist eine einfache Möglichkeit, um die Leistung zu lähmen.
Caveats
Beachten Sie, dass für Renderer und Editoren zu arbeiten, müssen Sie die JTable
sagen, wenn eine bestimmte Renderer / Editor zu verwenden. Es gibt grundsätzlich zwei Möglichkeiten, dies zu tun. Sie können den Standard CellRenderers / Editor für einen bestimmten Typ festgelegt unter Verwendung der jeweiligen JTable
Methoden. Für diese Art und Weise zu arbeiten, muß Sie TableModel
genau diese Art in der getColumnClass(...)
Methode zurückzukehren! Das Standardtabellenmodell wird nicht dies für Sie tun, es gibt immer Object.class
. Ich bin sicher, dass man eine Menge Leute stapfte hat.
Der andere Weg, den Editor / Renderer eingestellt ist, indem explizit auf der Spalte Einstellung selbst, das heißt, durch die TableColumn
über die getTableColumn(...)
Methode des JTable
bekommen. Das ist viel aufwendiger, aber es ist auch die einzige Möglichkeit, zwei verschiedene Renderer / Editoren für eine einzige Klasse zu haben. Z.B. Ihr Modell könnte zwei Spalten der Klasse String hat, die in ganz unterschiedlicher Weise erbracht werden, vielleicht einmal ein JLabel/DefaultRenderer
und die andere mit einem JButton
mit einem aufwendigeren Editor zuzugreifen.
JTable
mit benutzerdefinierten Renderer und Editoren ist extrem vielseitig, aber es ist auch viel in nehmen, und es gibt eine Menge Dinge falsch zu tun. Viel Glück!
Wie Tabellen verwenden in The Swing Tutorial ist Pflichtlektüre für alle, die Anpassung JTables. Insbesondere lesen und Konzepte nachzulesen: Editoren und Renderers , weil es in der Regel eine Weile, es zu „Klick“ dauert. Die Beispiele auf benutzerdefinierten Renderer und Editoren sind auch sehr lohnenswert.
Andere Tipps
Die Klasse, die Sie in Verlängerung aussehen wollen Ihr eigenes Verhalten zu erstellen, ist DefaultTableModel. Das ermöglicht es Ihnen, Ihr eigenes Verhalten zu definieren. Ein ordentliches Tutorial können auf Sonnen Website .
Dieses Tutorial von der java Lobby leicht zu folgen. Die Online- Swing-Trail für JTable dass Sie verweisen zeigt dass sie aktualisiert wurde. Haben Sie die ganze Sache scannen durch mögliche besser (ist nicht immer besser, neuere) Informationen?
Wenn Sie versuchen, eine einfache JTable
mit 1 Spalte bearbeitbar zu verwenden und Sie kennen die Spaltenort Sie immer Standardtabellenmodell verwenden könnte und die isCellEditable
Anruf überlasten.
so etwas wie folgt aus:
myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
if (column == x) {
return true;
} else
return false;
}
});
Und für das Kontrollkästchen einer Renderer-Klasse erstellen
MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
Einige nützliche Klassen sind:
Package javax.swing.table
:
TableModel
- Schnittstelle für eine tablemodel
AbstractTableModel
- Nizza-Klasse für die Erstellung Ihrer eigene Tabelle mit benutzerdefinierten Datenstrukturen zu erweitern
DefaultTableModel
- Standard-Tabellenmodell, das mit arrays[]
und Vectors
umgehen kann
So deaktivieren Sie die Bearbeitung auf einer beliebigen Zelle müssen Sie die isCellEditable(int row, int col)
Methode außer Kraft setzen
in der Tabelle Modell, sollten Sie „isCellEditable“ und „setValueAt“ Funktionen, wie unten außer Kraft setzen.
Spalte 4 ist die Spalte für bearbeitbare Zellen.
Dann, wenn Sie doppelt auf die Zelle klicken und geben Sie etwas,
setValueAt () aufgerufen und der Wert auf den Tischmodell des DO, Feld col4.
public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table
@Override
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
} else {
return false;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
if (col == 4) {
tbmData.get(row).col4= (String) value;
}
fireTableCellUpdated(row, col);
} else {
}
}