java中JTable的排序_java-JTable仅以编程方式排序

我有一个可排序的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值