JTable
列見出しをクリックすると列がソートされることはわかっていますが、列名を右クリックすると、関数名「ソート」が表示される必要があります。それを行う上で何か提案はありますか?
2 に答える
3
テーブルに a を追加することから始めMouseListener
ます。マウスリスナーの書き方を参照してください
クリック ポイントを列に変換する必要があります。 を参照してくださいJTable#columnAtPoint
。
次に、テーブルの を更新する必要がありSortKey
ます。例については、並べ替えとフィルタリングを確認してください
于 2013-08-27T07:40:36.560 に答える
2
私があなたを正しく理解していれば、通常の左クリックではなく、明示的なアクション (ポップアップで fi をトリガー) でソートする必要があります。
もしそうなら、トリッキーな部分は ui-delegate に何もしないように強制することです。次の 2 つのオプションがあります。
- 最近のQAで説明されているように、uiデリゲートによってインストールされたデフォルトのマウスリスナーにフックします
- UI に任せて、ルールに従わないソーターの実装でだまします (注意: これは最初のアプローチと同じくらい汚いです!)
振る舞いの悪いソーター:
public class MyTableRowSorter extends TableRowSorter {
public MyTableRowSorter(TableModel model) {
super(model);
}
/**
* Implemented to do nothing to fool tableHeader internals.
*/
@Override
public void toggleSortOrder(int column) {
}
/**
* The method that really toggles, called from custom code.
*
* @param column
*/
public void realToggleSortOrder(int column) {
super.toggleSortOrder(column);
}
}
// 利用方法
final JTable table = new JXTable(new AncientSwingTeam());
table.setRowSorter(new MyTableRowSorter(table.getModel()));
Action toggle = new AbstractAction("toggleSort") {
@Override
public void actionPerformed(ActionEvent e) {
JXTableHeader header = SwingXUtilities.getAncestor(
JXTableHeader.class, (Component) e.getSource());
Point trigger = header.getPopupTriggerLocation();
int column = trigger != null ? header.columnAtPoint(trigger) : -1;
if (column < 0) return;
int modelColumn = header.getTable().convertColumnIndexToModel(column);
((MyTableRowSorter) header.getTable().getRowSorter())
.realToggleSortOrder(modelColumn);
}
};
JPopupMenu menu = new JPopupMenu();
menu.add(toggle);
table.getTableHeader().setComponentPopupMenu(menu);
ええ、いくつかの SwingX API をスローするのを我慢できませんでした、怠惰な私 :-) プレーンな Swing では、さらにいくつかの行を記述する必要がありますが、基本は同じです: 巧妙なソーターをインストールし、そのカスタム トグル ソートを使用して実際にソートします必要に応じて、mouseListener で fi を使用します。
于 2013-08-28T08:04:33.910 に答える