1

比較述語を使用して並べ替えを行わずに、テーブル行を列で並べ替えるための JTable アイコンと動作を有効にするにはどうすればよいですか? つまり、テーブル ヘッダーに、使用されている列の昇順/降順の並べ替えの矢印を表示し、並べ替え順序/列の変更時に適切なメソッドを呼び出すようにするにはどうすればよいですか?

SQL クエリまたはビューに基づく (編集可能、フィルター可能、並べ替え可能) JTable を作成しようとしています。行がメモリに収まらない可能性があり、Java オブジェクトにきれいにマップされない可能性があるため、SQL 内ですべての並べ替え/フィルタリングを実行したいと考えています。列による並べ替え、値によるフィルタリング、および表示列に対応するようにクエリを変更するためのコードは既に記述しています。

TYPE_SCROLL_SENSITIVE,これを使用するために、とを使用して ResultSet に基づいて JTableModel を作成する予定ですCONCUR_UPDATABLE。これにより、DB への変更が ResultSet に反映されます。定期的に (1 秒間に数回) ResultSet から表示されている JTable を強制的に更新し、データベースへの変更がユーザーに表示されるようにします。テーブルに対するユーザーの変更は、検証後に更新可能な ResultSet に渡されます。

ソートが通常どのように行われるかを少し調べましたが、ほとんどの実装は、JTable が Comparator 述語を使用して javax.swing.RowSorter を作成するか、変更時にイベントを発生させるソートされた行のリストを維持することに依存しているようです。だから、私の質問:

ORM フレームワークは、データがエンティティ オブジェクトに適切にマッピングされないため、この質問に対する答えではありません。また、使用している DBMS は H2 です。

編集: Comparator の適用または行オブジェクトへの述語の並べ替えに基づく並べ替え可能な JTable ライブラリも、残念ながら不適切です。ソートを実行するためにすべてのオブジェクトをメモリに保持できるとは思いません。この問題により、SwingX JXTables、GlazedLists、または同様のライブラリを使用できません。できればいいのですが、できません。限目。

** 数千行、場合によっては数百万行、多数の列を処理します。はい、並べ替えとフィルタリングを行うには SQL を使用する必要があります。**

質問: (重要度の降順)

  1. 行の並べ替えに使用される列のインジケーターを表示するにはどうすればよいですか?
  2. ソート順を変更するために列ヘッダーを左クリックしたときに、JTable が適切なイベントを発生させるにはどうすればよいですか?
  3. データベースが変更されたときに JTable を強制的に更新する簡単な方法はありますか?
  4. このすべてをかなり簡単にするライブラリはありますか (DB クエリまたはビューと JTable を接続します)。
  5. このようなシステムを設計すると、恐ろしい、恐ろしい問題に遭遇するのでしょうか?
4

4 に答える 4

1

データベースでソートを行う行ソーターを作成するために、javax.swing.RowSorter をサブクラス化できるはずです。API ドキュメントから:

「RowSorter の実装には、通常、基になるモデルとの 1 対 1 のマッピングはありませんが、可能です。たとえば、データベースが並べ替えを行う場合、toggleSortOrder は (バックグラウンド スレッドで) データベースを呼び出し、オーバーライドする可能性があります。渡された引数を返すマッピング メソッド。」

http://docs.oracle.com/javase/6/docs/api/javax/swing/RowSorter.html

于 2012-06-08T11:28:16.823 に答える
1

1 と 2 の答えとして、組み込みの並べ替え (およびフィルター処理) を備えたテーブル クラスが既に含まれているSwingXを確認してください。これを適応させることができるかもしれません。

このようなシステムを設計すると、恐ろしい、恐ろしい問題に遭遇するのでしょうか?

経験上、そうです。私は、これとほぼ同じプロジェクトに取り組みました。このプロジェクトでは、データベース テーブルに「魔法のように」バインドされていると思われる JTable が設計されていました。これにより、表示ロジックとデータベース アクセスが結合されて 1 つの大きな混乱が生じました。これを、リフレクション駆動のテーブル モデルと個別のレコード CRUD 操作に完全に置き換えました。

ORMは答えではないとあなたは言います...

  • データの形式が変わらない場合は、とにかく検討する価値があります。「エンティティ」クラスは、実世界のエンティティを表す必要はありません。

  • (私が思うに)エンティティ形式が変更された場合、検討する価値があるかもしれません:

    • Recordレコードをキーと値のペアとして格納する柔軟なマップベースのクラス。

    • 表示ロジック用に動的に構築されたテーブル モデル。レコード キーのクエリによって構築され、SwingX テーブルにプラグインされて無料で並べ替えとフィルタリングを行います。

    • Repositoryデータベースへのアクセスをテーブル自体とは別にカプセル化する、同様に設計されたクラスで、 のロードと保存を担当しRecordます。これは、更新可能ResultSetなビューとビューの間のアダプターとして機能します (ただし、ResultSetこの方法を使用すると、データが表示されている間に開いているデータベース接続が必要になるかどうかを確認します...)。

    この「レコードを表示およびソートするテーブル」と「データを管理するリポジトリ」への分離は、次のことを意味します。

    • データベースにバインドされていないデータに対してテーブルを再利用できます。
    • データベースにバインドされたレコードをテーブル以外のものに表示できます。
    • ものを構築してテストしようとして気が狂うことはありません:)
于 2009-05-26T21:59:12.667 に答える
1

私自身は使用したことがありませんが、JIDE Data Gridsは、SQL WHERE および ORDER BY を使用したフィルタリングとソートのサポートを提供する DatabaseTableModel を提供します。

于 2009-05-27T08:38:36.387 に答える
0

データベースのことはさておき、JIDE グリッドの一部である SortableTable というクラスがあります。テーブル ヘッダーに小さな ^ または v で並べ替えを表示し、複数の列 (1v、2v など) による並べ替えをサポートします。

代替テキスト

于 2009-05-26T22:08:52.630 に答える