1

次のコードをリスナーとしてJTableHeaderに追加しました。

        header.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JTableHeader header = (JTableHeader) e.getSource();
            JTable table = header.getTable();
            TableColumnModel columnModel = table.getColumnModel();
            int vci = columnModel.getColumnIndexAtX(e.getX());
            int mci = table.convertColumnIndexToModel(vci);
            if (mci == targetColumnIndex) {
                TableColumn column = columnModel.getColumn(vci);
                Object v = column.getHeaderValue();
                boolean b = Status.DESELECTED.equals(v) ? true : false;
                TableModel m = table.getModel();
                for (int i = 0; i < m.getRowCount(); i++) m.setValueAt(b, i, mci);
                column.setHeaderValue(b ? Status.SELECTED : Status.DESELECTED);
                //header.repaint();
            }
        }
    });

1つ以上のセルを手動で選択した場合、ckeckAllヘッダーをクリックすると、このコードが実行され、行の視覚的な順序が変更され、選択したセルが下/上にジャンプします。何か案は?

4

1 に答える 1

2

TableHeadersには、その列に格納されている特定のタイプJTableのに基づいて値を並べ替える組み込みのリスナーがすでに組み込まれています。ComparatorObject

組み込みのリスナーを上書きする代わりに、そのテーブルに2番目のリスナーを追加します。つまり、両方のアクションの効果がわかります。

アップデート

並べ替え機能が必要ない場合は、行ソーターを無効にするか、独自の機能を実装することができます。独自のカスタムを実装することもできますTableColumn

于 2012-08-06T17:33:11.797 に答える