2

JTable1 つの非表示の列に基づいて行を並べ替えたいと思います。

このような JTable があるとします

column1   column2
val1       val2

これで、非表示になっている column3 がもう 1 つあり、表示したくありません。ユーザーが Column2 をクリックすると、Column2 ではなく、Column3 (非表示の列) に基づいて行を並べ替える必要があります。

JTableでこれを達成するにはどうすればよいですか?

4

3 に答える 3

3

ここに投稿されたコードを使用してください:http ://www.esus.com/docs/GetQuestionPage.jsp?uid = 1270

変数/メソッド引数がありますcol-それがあなたのcolumn2であるかどうかを確認し、そうであればそれをあなたの隠し列であるかのように扱います-それでソートしてテーブルを再レンダリングします。

于 2011-08-04T07:51:32.743 に答える
2

1 つの方法は、この例に示すように、 type のComparableインターフェイスを実装し、対応する値を使用して比較することです。便利なことに、既に を実装している場合は、で を行っているように、 に委譲することができます。Column2Column3Column3Comparable<Column3>Column3Double

于 2011-08-04T10:35:03.027 に答える
2

デフォルトでTableRowSorterJTableに追加できますが、 RowSorterがあり、Darryl のMultisort Table Header Cell Rendererほど優れた明確なものはありません

RowSorter の定義は具体的な TableColumn に対してのみ有効であることに注意してください

単純な例(役に立たないバラストを再度使用)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class HeaderDoubleclickTest {

    private String[] columnNames = {"String", "Integer", "Boolean"};
    private Object[][] data = {
        {"aaa", 12, true}, {"bbb", 5, false},
        {"CCC", 92, true}, {"DDD", 0, false}
    };
    private TableModel model = new DefaultTableModel(data, columnNames) {

        private static final long serialVersionUID = 1L;

        @Override
        public Class<?> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    };
    private JTable table = new JTable(model);
    private JTableHeader header;

    static class TestTableRowSorter extends TableRowSorter<TableModel> {

        TestTableRowSorter(TableModel m) {
            super(m);
        }

        @Override
        public void toggleSortOrder(int column) {
        }

        public void wrapToggleSortOrder(int column) {
            super.toggleSortOrder(column);
        }
    }
    private Timer timer = new Timer(400, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("single");
            JTable table = header.getTable();
            RowSorter sorter;
            if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
                int columnIndex = header.columnAtPoint(pt);
                if (columnIndex != -1) {
                    columnIndex = table.convertColumnIndexToModel(columnIndex);
                    ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
                }
            }
        }
    });
    private Point pt;

    public JComponent makeUI() {
        timer.setRepeats(false);
        table.setRowSorter(new TestTableRowSorter(model));
        header = table.getTableHeader();
        header.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(final MouseEvent e) {
                if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
                    System.out.println("double");
                    pt = null;
                    timer.stop();
                } else {
                    pt = e.getPoint();
                    timer.restart();
                }
            }
        });
        JPanel p = new JPanel(new BorderLayout());
        p.add(new JScrollPane(table));
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new HeaderDoubleclickTest().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
于 2011-08-04T08:02:11.920 に答える