Frage

Wie kann ich JTable Symbole und Verhaltensweisen zum Sortieren von Tabellenzeilen durch eine Spalte zu ermöglichen, ohne dass es einen Vergleich Prädikat verwenden, um die Sortierung zu tun? Das heißt, wie kann ich die Tabellenköpfe sagen den Pfeil für den Aufstieg zum Anzeigen / Sortierreihenfolge in der Spalte absteigend verwendet wird, und bekommen es geeignete Methoden, wenn Sortierreihenfolge / Spaltenwechsel nennen?

Ich versuche, einen (editierbaren, filterbar, sortierbar) JTable durch eine SQL-Abfrage oder Ansicht gesichert zu erstellen. Die Reihen können nicht in den Speicher passen und nicht sauber zu Java-Objekten zugeordnet werden, so will ich alle Sortierung / Filterung innerhalb von SQL zu tun. Ich habe bereits den Code zum Ändern eine Abfrage geschrieben von Spalte, Filterung von Werten Sortierung aufzunehmen, und sichtbaren Spalten.

Um dies zu nutzen, ich plane einen JTableModel zu schreiben, basierend auf einem ResultSet mit TYPE_SCROLL_SENSITIVE, und CONCUR_UPDATABLE, so Änderungen an der DB an die ResultSet weitergegeben wird. Ich werde regelmäßig (mehrmals pro Sekunde) zwingen, eine Aktualisierung des sichtbaren JTable aus dem ResultSet, so Änderungen an der Datenbank für den Benutzer sichtbar. Benutzer Änderungen an die Tabelle werden den aktualisierbaren ResultSet nach der Validierung übergeben werden.

Ich habe ein wenig in Frage nachging, wie Sortierung normalerweise getan wird, aber die meisten Implementierungen scheinen auf der JTable einen javax.swing.RowSorter mit einem Komparator Prädikat verlassen zu schaffen, oder eine sortierte Liste von Zeilen auf der Erhaltung, die Ereignisse ausgelöst wird, wenn geändert. Also, meine Fragen:

ORM-Frameworks ist keine Antwort auf diese Frage, da die Daten der Karte nicht gut auf Entitätsobjekten. Auch die DBMS Ich bin mit H2.

EDIT: Sortable JTable Bibliotheken basierend auf Comparators oder Sortier Prädikate Anwendung Objekte rudern sind auch nicht geeignet, leider. Ich glaube nicht, ich in der Lage sein wird, alle Objekte im Speicher zu halten, um führen zu sortieren. Dieses Problem hindert mich daran, mit dem SwingX JXTables, GlazedLists oder ähnlichen Bibliotheken. Ich wünschte, ich könnte, aber ich kann es nicht. Period.

** Ich werde mit vielen tausend Zeilen zu tun hat, möglicherweise Millionen, mit zahlreichen Spalten. Ja, ich brauche wirklich SQL zu verwenden, um die Sortierung und Filterung zu tun. **

Fragen: (in absteigender Bedeutung)

  1. Wie kann ich Indikatoren, für die Spalte verwendet wird, um Zeilen zu sortieren?
  2. Wie erhalte ich die JTable entsprechende Ereignisse auszulösen, wenn die Spaltenüberschriften sind links geklickt Sortierreihenfolge ändern?
  3. Gibt es einen einfacheren Weg, um die JTable zu zwingen, zu aktualisieren, wenn sich die Datenbankänderungen?
  4. Gibt es eine Bibliothek, die alle diese wesentlich einfacher (Anschluss DB-Abfragen oder Ansichten und JTables) machen würde?
  5. Bin ich in schreckliche, schreckliche Probleme laufen, wenn ich das System wie dieses Design?
War es hilfreich?

Lösung

Ich habe es selbst nie aber JIDE Daten Grids einen DatabaseTableModel, zur Verfügung stellt filtern und Sortieren Unterstützung durch SQL WHERE und Reihenfolge.

Andere Tipps

In Antwort auf 1 und 2 Besuche SwingX , die bereits eine Tabellenklasse umfasst mit Einbau-Sortierung (und Filterung). Sie können diese anpassen können.

  

Bin ich in schreckliche, schreckliche Probleme laufen, wenn ich das System wie dieses Design?

Aus der Erfahrung, ja. Ich arbeitete an einem Projekt fast genau das gleiche wie das, wo jemand eine JTable entworfen hatte, die angeblich ‚magische Weise‘ zu einer Datenbanktabelle gebunden. Dieser gekoppelte Anzeigelogik und Datenbankzugriff zusammen in einem großen schrecklichem Chaos, das wir völlig mit Reflexion getriebenen Tischmodellen und separaten Datensatz CRUD-Operationen ersetzt.

Sie sagen, dass ORM nicht die Antwort ist ...

  • Wenn das Format der Daten nicht ändert, dann lohnt es sich angesichts ohnehin. Ihre ‚Unternehmen‘ Klassen müssen nicht repräsentieren reale Einheiten.

  • Wenn Ihre Unternehmen Formatänderungen (wie ich vermute), könnte es sein, eine Überlegung wert:

    • Eine flexible kartenbasierte Record Klasse, welche Datensätze als Schlüssel-Wert-Paare speichert;

    • Dynamisch gebaute Tischmodelle für Ihre Display-Logik, durch Abfragen Satzschlüssel aufgebaut, angeschlossen in SwingX Tabellen sortieren und filtert kostenlos zu bekommen;

    • Eine ähnlich gestaltete Repository Klasse, die Zugriff auf Ihre Datenbank getrennt von der Tabelle selbst, verantwortlich für das Laden und Speichern Records kapselt. Dies dient als Adapter zwischen aktualisierbar ResultSet und der Aussicht (obwohl ich würde prüfen, ob eine ResultSet auf diese Weise unter Verwendung wird eine offene Datenbankverbindung benötigen, während Daten sichtbar sind ...).

    Diese Trennung in ‚eine Tabelle, die zeigt und sortiert Datensätze‘ und ‚ein Repository, das die Daten verwaltet‘ bedeutet:

    • Sie können die Tabelle wiederverwendet werden für nicht-Datenbank gebundenen Daten;
    • Sie können Datenbank gebundenen Datensätze in anderen Dingen als Tabellen angezeigt werden;
    • Sie werden nicht verrückt werden versuchen, die Sache zu bauen und testen:)

Es soll möglich sein javax.swing.RowSorter, um eine Unterklasse eine Reihe Sortierer zu schaffen, die die Sortierung in der Datenbank der Fall ist. Aus der API-Dokumentation:

"RowSorter Implementierungen haben in der Regel keine Eins-zu-Eins-Abbildung mit dem zugrunde liegenden Modell, aber sie können. Wenn beispielsweise eine Datenbank, die Sortierung der Fall ist, könnte toggleSortOrder in die Datenbank aufrufen durch (auf einer Hintergrund-Thread), und überschreibt die Mapping-Methoden, um das Argument zurückzugeben, die in übergeben wird. "

http://docs.oracle.com/ JavaSE / 6 / docs / api / javax / Swing / RowSorter.html

Beim Verlassen der Datenbank Sachen beiseite gibt es eine Klasse namens SortableTable , die ein Teil von JIDE ist Grids. Es zeigt die Sortieranlage mit einem kleinen oder v ^ in dem Tabellenkopf und unterstützt von mehr als 1-Säule (1V, 2V, etc.) zu sortieren.

alt text

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top