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.

War es hilfreich?

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 JTables 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.

speichern werden
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 {
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top