質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5821閲覧

JavaFXのTableViewの並べ替え

serona

総合スコア25

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/06/20 01:51

###前提・実現したいこと
JavaFXで設置したTableViewについて、
並べ替えをするコードの書き方が分かりません><

testTable table = new testTable();
table.addData("あああ",1,4)
table.addData("いいい",9,6)
table.addData("ううう",5,2)

といったように、tableViewにデータを追加した後
「Bの列の数字が大きい順に並べ替えをする」というコードは、どのように書けばいいのでしょうか?
アプリケーションを実行中、tableViewの列ヘッダーをクリックしてソートすることはできるので、
それと同じ様な感じに並べ替えしたいのですが・・・

質問に不足な点などあったらご指摘下さい。
よろしくお願いします(T_T)

###testController

Java

1public class testController implements Initializable { 2 @Override 3 public void initialize(URL location, ResourceBundle resources) { 4 testTable.setTable(testTable); 5 } 6 @FXML 7 private TableView<testTable.testTableData> testTable;

###testTable

Java

1 private static TableView<testTableData> table; 2 private static ObservableList<testTableData> data = FXCollections.observableArrayList(); 3 4 public static void setTable(TableView<testTableData> table) { 5 testTable.table = table; 6 new testTable().createTableView(); 7 } 8 9 public ObservableList<testTableData> getTableDatas() { 10 return data; 11 } 12 13 public void addData(String aStr, Integer bInt, Integer cInt) { 14 data.add(new testTableData(aStr, bInt, cInt)); 15 } 16 17 @SuppressWarnings("unchecked") 18 public TableView<testTableData> createTableView() { 19 20 TableColumn<testTableData, String> columnA = new TableColumn<testTableData, String>("A"); 21 TableColumn<testTableData, Integer> columnB = new TableColumn<testTableData, Integer>("B"); 22 TableColumn<testTableData, Integer> columnC = new TableColumn<testTableData, Integer>("C"); 23 24 table.getColumns().addAll(columnA, columnB, columnC); 25 table.setItems(data); 26 27 return table; 28 } 29 30 31 public class testTableData { 32 private String aStr; 33 private Integer bInt; 34 private Integer cInt; 35 36 public testTableData(String aStr, Integer bInt, Integer cInt,) { 37 this.aStr = aStr; 38 this.bInt = bInt; 39 this.cInt = cInt; 40 } 41 42 public String getAStr() { 43 return aStr; 44 } 45 46 public void setAStr(String aStr) { 47 this.aStr = aStr; 48 } 49 50 public Integer getBInt() { 51 return bInt; 52 } 53 54 public void setBInt(Integer bInt) { 55 this.bInt = bInt; 56 } 57 58 public Integer getCInt() { 59 return cInt; 60 } 61 62 public void setCInt(Integer cInt) { 63 this.cInt = cInt; 64 } 65 } 66} 67

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

説明の都合上、Javaの標準的な命名規則に従いクラス名はtestTableDataクラスではなくTestTableDataクラスと仮定して回答します。またTableViewのインスタンスは変数tableViewが保持していると仮定します。
(プログラムの一部しか明示しないことはかまわないのですが、本件の場合どういう構造を仮定しているか充分推測できない点があります。実際に反映する際にはご自分で判断し適宜変数名などを置き換えてください)


テーブルの行を並べ替える戦略にはいくつかのアプローチがあります。

コードでは「TableView#itemsプロパティーへ直接要素を追加する」という方法を用いておられるので、TableViewのitemsプロパティーにはmutable(変更可能)なObservableListを設定しているという前提ですね。その場合はTableView#itemsプロパティーの値であるObservableListを並べ替えればよいです。

それをするにはまずテーブルのモデルの並べ替えをするのに必要なComparator<TestTableData>が必要です。TestTableDataのbInt属性を降順に並べるためのComparatorは例えば次のようにすると得ることができます。

java

1Comparator<TestTableData> comparator = 2 Comparator.<TestTableData, Integer>comparing(model -> model.getBInt()) 3 .reversed();` 4 5// 上記は次のような定義をするのと同じ意味になりますがより直感的に分かり易い表現だと思います 6 7Comparator<TestTableData> comparator = new Comparator<>() { 8 @Override 9 public int compare(TestTabledata a, TestTableData b) { 10 return -(a.getBInt() - b.getBInt()); // 整数の自然順序(昇順)の逆 11 } 12}; 13//訂正:下の方の実装例を間違えて書いてましたのでコードを訂正しまた。失礼しました。

さて実際のソートはFXCollectionにObservableListをソートできる便利メソッドがありますので前述のComparatorを使うと以下のように書けます。

Java

1FXCollections.sort(tableView.getItems(), comparator);

他にもjavafx.collections.transformation.SortedList<E>というimmutableなクラスがあり、任意のObservableListの「ソート済みのビュー」を得ることができますので、「テーブルのモデルデータを別途変更可能なObservableListとして管理し、TableView#itemsプロパティーにはモデルデータのソートされたビューを設定する」という戦略も考えられます。その場合はテーブルのモデルへデータを追加すると何もしなくても自動的にソート結果が常にテーブルへ表示されるようになります。

投稿2017/06/20 04:38

編集2017/06/20 05:08
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

serona

2017/06/20 05:14

お早い回答感謝です! また、命名規則について、ご指摘ありがとうございます。 質問する前に、例のため書き換えたコードをしっかり確認するべきでした… 以後気をつけます!すみません>< お教え頂いた方法で、降順への並び替えが上手くできました! コードの説明などなど、とても丁寧に回答して頂き、勉強になりました。 ありがとうございます(>人<)
KSwordOfHaste

2017/06/20 05:20

最初Comparatorの定義を間違えて書いてしまい、あわてて直しました。お恥ずかしい限りです。 記憶でかいてはだめですね・・・
guest

0

BでもCでも並び替えが行いたいのであれば必要なものについてComparatorを作成するのがいいかと思います。

testTable

java

1 2 public void sortByB() { 3 data.sort(new BComparator()); 4 } 5 6 public void sortByC() { 7 data.sort(new CComparator()); 8 } 9 10

java

1 class BComparator implements Comparator<testTableData> { 2 3 public int compare(testTableData o1, testTableData o2) { 4 5 return o1.getBInt() - o2.getBInt(); 6 } 7 } 8 class CComparator implements Comparator<testTableData> { 9 10 public int compare(testTableData o1, testTableData o2) { 11 12 return o1.getCInt() - o2.getCInt(); 13 } 14 }

投稿2017/06/20 04:23

7tsuno

総合スコア310

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

serona

2017/06/20 04:55

迅速な回答、ありがとうございます!! この方法で、やりたかった並び替えができました!(*´∀`*) とてもシンプルに回答して頂いて、分かりやすかったです! 感謝です!!(>人<)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問