JFileChooserの詳細表示でソートする列を指定する
Total: 422, Today: 1, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JFileChooserの詳細表示で使用するJTableが初期状態でソートする列を指定します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
JFileChooserにAncestorListenerを追加JFileChooserの親ダイアログでsetVisible(true)が呼び出されたときに実行されるancestorAdded(AncestorEvent)で詳細表示用のJTableを検索- 詳細表示用
JTableからRowSorterを取得しRowSorter#setSortKeys(...)でソートする列を指定 - このサンプルでは初回やソートキーが空の場合
JSpinnerでソートする列、JComboBox<SortOrder>でソート方向を指定可能- それ以外の場合は前回設定したソート状態を維持する
- ソートする列を
-1にした場合、table.getRowSorter().setSortKeys(Collections.emptyList())で空のソートキーを設定してソート状態をリセットする