2

JTableが設定した場所がありますtable.setAutoCreateRowSorter(true);。私の主な目的は、列の並べ替え順序に関係なく、常に 1 つの行を一番上に置くことです。私が最初にしたことはcompareTo、セルのデータ型のメソッドを変更して、「他の何よりも少ない」ことを意味するフラグを理解し、そのアイテムを常に一番上にソートすることでした。残念ながら、列の並べ替え順序に応じて、指定された行が常に一番上または一番下になるようにしました。したがって、並べ替え順序が降順の場合、セルの有効値が他の何よりも大きくなるようにセルを設定する必要があります。唯一の問題は、列の並べ替え順序を取得する方法がわからないことです。

このページでは、提案された答えの 1 つが次のようなものです。

if (myTable.getRowSorter().getSortKeys().get(column).getSortOrder == SortOrder.ASCENDING) {
    ...
}

残念ながら、getSortKeys()は常に空のリストを返します。だから私は正方形に戻っています。RowSorterListener を追加することも検討しましたが、これは、並べ替え順序が変更されたときではなく、ソーターが変更されたときのリスナーのようです。

何か助けはありますか?ありがとう!

編集:これは私の問題の一部を示すコードです。結果が常にゼロである System.out.println に注意してください。列の行の並べ替え順序を取得したいのですが、存在しないようです。

package tablecolumn;

import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.AbstractTableModel;

public class Tablecolumn extends JFrame {
    JScrollPane scroll;
    JTable table;
    MyTableModel model;

    static String[] columnnames = new String[] {"A", "B", "C"};

    public class MyTableModel extends AbstractTableModel {
        public List<List<String>> entries;

        MyTableModel() {
            entries = new ArrayList<List<String>>();
            for (int i=0; i<5; i++) {
                List<String> cols = new ArrayList<String>();
                cols.add("X" + i);
                cols.add("Y" + i);
                cols.add("Z" + i);
                entries.add(cols);
            }
        }

        @Override
        public int getRowCount() {
            return entries.size();
        }

        @Override
        public int getColumnCount() {
            return columnnames.length;
        }

        @Override
        public Object getValueAt(int r, int c) {
            List<? extends RowSorter.SortKey> rsk = table.getRowSorter().getSortKeys();
            System.out.println(rsk.size());
            return entries.get(r).get(c);
        }

        @Override
        public Class getColumnClass(int c) { 
            return String.class; 
        }

        @Override
        public String getColumnName(int c) { return columnnames[c]; }        

        @Override
        public boolean isCellEditable(int row, int col) { return false; }

    }

    public Tablecolumn() {
        scroll = new JScrollPane();
        model = new MyTableModel();
        table = new JTable();

        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        table.getTableHeader().setReorderingAllowed(false);
        table.setColumnSelectionAllowed(false);
        table.setRowSelectionAllowed(true);

        scroll.setViewportView(table);

        scroll.setMinimumSize(new Dimension(200, 200));
        scroll.setPreferredSize(new Dimension(800, 600));

        GroupLayout layout2 = new GroupLayout(this.getContentPane());
        this.setLayout(layout2);
        layout2.setVerticalGroup(
            layout2.createSequentialGroup()
                .addComponent(scroll)
        );
        layout2.setHorizontalGroup(
            layout2.createParallelGroup()
                .addComponent(scroll)
        );               

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        pack();
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Tablecolumn().setVisible(true);
            }
        });
    }
}
4

2 に答える 2

2

1)SSCCEの投稿を繰り返し要求することを無視するため、質問は単純に答えられません

2)例えば

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.RowSorter.SortKey;

class SelectedColumnTest {

    private JTableHeader header;
    private Object selectedColumn = null;
    private String[] columnNames = {"String", "Integer", "Boolean"};
    private Object[][] data = {{"aaa", 12, true}, {"bbb", 5, false}, {"CCC", 92, true}};
    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);

    public JComponent makeUI() {
        table.setRowSorter(new TableRowSorter<TableModel>(model) {

            @Override
            public void toggleSortOrder(int column) {
            }
        });
        header = table.getTableHeader();
        header.getActionMap().put("toggleSortOrder2", new AbstractAction() {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                e.setSource(table);
                table.getActionMap().get("focusHeader").actionPerformed(e);
                if (selectedColumn != null) {
                    int i = header.getColumnModel().getColumnIndex(selectedColumn);
                    SortOrder order = SortOrder.ASCENDING;
                    List<SortKey> keys = new ArrayList<SortKey>(table.getRowSorter().getSortKeys());
                    if (!keys.isEmpty()) {
                        SortKey sortKey = keys.get(0);
                        if (sortKey.getColumn() == i && sortKey.getSortOrder() == SortOrder.ASCENDING) {
                            order = SortOrder.DESCENDING;
                        }
                    }
                    table.getRowSorter().setSortKeys(Arrays.asList(new SortKey(i, order)));
                }
                header.repaint();
            }
        });
        InputMap im = header.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0), "toggleSortOrder2");
        header.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                JTableHeader h = (JTableHeader) e.getSource();
                int i = h.columnAtPoint(e.getPoint());
                Object o = h.getColumnModel().getColumn(i).getHeaderValue();
                if (i < 0 || o == selectedColumn) {
                    selectedColumn = null;
                    return;
                }
                selectedColumn = o;
                h.requestFocusInWindow();
            }
        });
        final TableCellRenderer hr = table.getTableHeader().getDefaultRenderer();
        header.setDefaultRenderer(new TableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable t, Object v,
                    boolean isS, boolean hasF, int row, int col) {
                return (v == selectedColumn) ? hr.getTableCellRendererComponent(
                        t, v, true, true, row, col) : hr.getTableCellRendererComponent(
                        t, v, false, false, row, col);
            }
        });
        header.setToolTipText("Sorting by F8");
        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 SelectedColumnTest().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

3)SSCCEを使用して質問を編集し、問題を正確に示した瞬間に、それを確認します

4)Darrylのマルチソートテーブルヘッダーセルレンダラーほど優れたものはありません

于 2012-05-06T07:06:13.183 に答える
0

問題は、を使用すると、常に空のリストを返すtable.setAutoCreateRowSorter(true);バグがあることだと思います。myTable.getRowSorter().getSortKeys()一方、独自の行ソーターを追加すると、機能します。

このコードを追加する必要がありました:

RowSorter<MyTableModel> sorter =
    new TableRowSorter<MyTableModel>(model);
table.setRowSorter(sorter);

これで、getSortKeys()列とそのソート順のリストが返されます。そのリストは、クリックした列に応じて可変長であるため、リストを反復処理して and を確認する必要がありますmyTable.getRowSorter().getSortKeys().get(index).getColumn()myTable.getRowSorter().getSortKeys().get(index).getSortOrder()ここで、後者にはSortOrder.ASCENDINGまたはの値が含まれていますSortOrder.DESCENDING

于 2012-05-07T16:06:10.927 に答える