0

JTable列見出しをクリックすると列がソートされることはわかっていますが、列名を右クリックすると、関数名「ソート」が表示される必要があります。それを行う上で何か提案はありますか?

4

2 に答える 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 に答える