JFileChooserの詳細表示でソートする列を指定する
Total: 196
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JFileChooser
の詳細表示で使用するJTable
が初期状態でソートする列を指定します。
Screenshot
Advertisement
サンプルコード
private JFileChooser makeFileChooser() {
return new JFileChooser() {
private transient AncestorListener handler = null;
@Override public void updateUI() {
removeAncestorListener(handler);
super.updateUI();
handler = new AncestorListener() {
@Override public void ancestorAdded(AncestorEvent e) {
JFileChooser fc = (JFileChooser) e.getComponent();
SwingUtils.setViewTypeDetails(fc);
SwingUtils.descendants(fc)
.filter(JTable.class::isInstance)
.map(JTable.class::cast)
.findFirst()
.ifPresent(table -> {
List<?> sortKeys = table.getRowSorter().getSortKeys();
int col = model.getNumber().intValue();
if (col < 0) {
table.getRowSorter().setSortKeys(Collections.emptyList());
} else if (sortKeys.isEmpty() && col < table.getColumnCount()) {
SortOrder order = combo.getItemAt(combo.getSelectedIndex());
RowSorter.SortKey key = new RowSorter.SortKey(col, order);
table.getRowSorter().setSortKeys(Collections.singletonList(key));
}
});
}
// ...
};
addAncestorListener(handler);
}
};
}
View in GitHub: Java, Kotlin解説
JFileChooser
にAncestorListener
を追加JFileChooser
の親ダイアログでsetVisible(true)
が呼び出されたときに実行されるancestorAdded(AncestorEvent)
で詳細表示用のJTable
を検索- 詳細表示用
JTable
からRowSorter
を取得しRowSorter#setSortKeys(...)
でソートする列を指定 - このサンプルでは初回やソートキーが空の場合
JSpinner
でソートする列、JComboBox<SortOrder>
でソート方向を指定可能- それ以外の場合は前回設定したソート状態を維持する
- ソートする列を
-1
にした場合、table.getRowSorter().setSortKeys(Collections.emptyList())
で空のソートキーを設定してソート状態をリセットする