我有一个可排序的JTable(通过在初始化时调用setAutoCreateRowSorter(true)使其可排序).我以编程方式对该表进行排序,并且希望禁用表头的默认事件处理,以便只能以编程方式对该表进行排序.如何实现呢?
代码的工作部分将是:
public class SortTable extends JDialog {
private JTable table;
DefaultRowSorter 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)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,其中包含带有Sort按钮的JTable.按下该按钮将导致A列升序排列.但是,按钮不是对表格进行排序的唯一方法-我们只需单击表格标题即可更改排序.我的问题是如何使按钮成为排序表格的唯一方法.
知道如何摆脱更改排序时出现的箭头也将非常高兴.
解决方法:
阅读有关类似问题的帖子(例如@mKorbel建议),并尝试一下自己,我设法找到了解决方案.
主要问题的答案将是:使用DefaultRowSorter的setSortable(int index,boolean sortable)方法.似乎很明显,但有趣的是,此方法在使用RowSorter的toggleSortOrder(int index)时禁用列的排序,但是在使用DefaultRowSorter的sort()方法时将被忽略.这是一种矛盾吗?无论如何,这让门开了个花招.现在我可以做:
for (int i=0 ; i
sorter.setSortable(i, false);
}
…而且瞧-无法再通过单击表标题对表进行排序,但是可以通过编程方式对表进行排序.
如果有人面临像我一样隐藏那些排序指示符图标的怪异要求,那就有办法了.首先会产生全局效果,但我不喜欢它-将相应的属性设置为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;
}
});
标签:swing,jtable,rowsorter,java
来源: https://codeday.me/bug/20191030/1966070.html