gpt4 book ai didi

java - JTable 仅以编程方式排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:14 28 4
gpt4 key购买 nike

我有一个 JTable,它是可排序的(通过在初始化时调用 setAutoCreateRowSorter(true) 使其可排序)。我以编程方式对该表进行排序,我想禁用表头上的默认事件处理,以便可以以编程方式对表进行排序。如何实现?

工作代码是:

public class SortTable extends JDialog {

private JTable table;

DefaultRowSorter<TableModel, String> sorter;

public SortTable() {
JScrollPane scrollPane = new JScrollPane();
setBounds(0, 0, 300, 200);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(scrollPane, BorderLayout.CENTER);

//-------most important stuff-------------------
table = new JTable();
table.setAutoCreateRowSorter(true); //enabling sorting
table.setModel(createModel());
sorter = (DefaultRowSorter<TableModel, String>)table.getRowSorter(); //store sorter to sort programatically later on
//-----------------------------------------------

scrollPane.setViewportView(table);
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
buttonPane.add(new JButton(getSortAction()));
}

private AbstractAction getSortAction() {
return new AbstractAction("Sort") {

@Override
public void actionPerformed(ActionEvent e) {
sorter.setSortKeys(Arrays.asList(new SortKey(0,SortOrder.ASCENDING)));
sorter.sort(); //sorting programatically

}
};
}

private DefaultTableModel createModel() {
return new DefaultTableModel(
new Object[][] {
{"1", "3"},
{"5", "2"},
{"4", null},
},
new String[] {
"A", "B"
}
);
}
}

此示例是一个 JDialog,其中包含一个带有排序 按钮的 JTable。按下该按钮将导致 A 列升序排序。但是,按钮并不是对表格进行排序的唯一方式 - 我们只需单击表格标题即可更改排序。我的问题是如何使按钮成为对表格进行排序的唯一方法。如果知道如何摆脱排序更改时出现的箭头,那也很好。

最佳答案

阅读有关类似问题的帖子(如@mKorbel 建议的)并亲自试验,我设法找到了解决方案。主要问题的答案是:使用 DefaultRowSorter 的 setSortable(int index, boolean sortable) 方法。看起来很明显,但有趣的是,当使用 RowSorter 的 toggleSortOrder(int index) 时,此方法会禁用列排序,但在使用 DefaultRowSorter 的 sort() 方法时会被忽略.这是一种矛盾吗?无论如何,这为诡计敞开了大门。现在我可以:

        for (int i=0 ; i<table.getColumnCount() ; i++) {
sorter.setSortable(i, false);
}

...瞧 - 无法再通过单击表格标题对表格进行排序,但可以通过编程对其进行排序。如果有人像我一样面临隐藏那些排序顺序指示器图标的奇怪要求,那么有很多方法。 First 会产生全局效果,我不喜欢它 - 将相应的属性设置为 UIManager。

        UIManager.put("Table.ascendingSortIcon", new EmptyIcon());
UIManager.put("Table.descendingSortIcon", new EmptyIcon());

更好的方法是装饰 TableHeader 的默认渲染器:

        final TableCellRenderer defaultRenderer = table.getTableHeader().getDefaultRenderer();
table.getTableHeader().setDefaultRenderer(new TableCellRenderer() {

@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JLabel label = (JLabel)defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setIcon(null);
return label;
}

});

关于java - JTable 仅以编程方式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com