[英]How can you disable all sorting code in JTable in 1.6
我有一个JTable扩展,自项目中的Java 1.3 / 1.4以来一直在使用,通过单击列提供列重新排序和排序等功能。 我们正在升级到Java 1.6,新的JTable阻止旧的排序代码工作。 将所有内容都安装到新的JTable API上会有一些广泛的返工。 在那之前有没有办法在JTable中完全禁用这些添加?
编辑:在进一步调查之后,问题集中在这样一个事实:标题上的鼠标事件被1.6中的Swing吞噬,并且没有传递给表实现,即使它设置了自己的标题呈现。 非常适合吹嘘的Java向后兼容性。
那么有没有办法让JTable 1.6停止? 我无法做到。 甚至覆盖表上的UI和表头也无济于事。
你试过JTable.setRowSorter(null)吗?
编辑:和setAutoCreateRowSorter ? (1.创建表,2。行分类器为null,3。自动创建分拣机为false,4。设置模型)。
我在我的JTable子类中使用它,它捕获鼠标事件就好了:
class QueueTable extends JTable {
public QueueTable() {
...
getTableHeader().addMouseListener(new SortColumnListener(1));
}
}
SortColumnListener
的实现方式如下:
class SortColumnListener extends MouseAdapter {
SortColumnListener(int column) { ... }
public void mouseClicked(MouseEvent e) {
TableColumnModel colModel = QueueTable.this.getColumnModel();
int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
if(columnModelIndex == column) {
// Do stuff
}
}
}
这可以很好地捕获SortColumnListener
鼠标事件,我可以对这些事件做任何我想做的事情。 我在JTable上没有设置RowSorter
实现,这在Java 5和Java 6中完美运行。
有关此类的完整源代码,请参阅: QueueTable.java
据我了解,你有两个问题:
setRowSorter(null)
禁用排序或通过重写setRowSorter(TableRowsorter)
来执行任何操作,它也不起作用,因为标头上的事件不会传递给您的JTable。 在这种情况下,我认为您的选择是将您的排序代码实现为TableRowSorter 。 我不知道您的排序代码有多复杂,是否可以映射TableRowSorter API,但这似乎是您可以尝试的另一种选择。
JTable.setAutoCreateRowSorter(false);
除非TableRowSorter设置在某处,否则我认为你不必调用setRowSorter(null)
单击标题时禁用排序的一种方法是删除所有表头的侦听器:
for(MouseListener listener : table.getTableHeader().getMouseListeners()){
table.getTableHeader().removeMouseListener(listener);
}
然后,如果您想要其他特定操作(例如列大小调整),您可以为该特定操作添加特定侦听器。
我测试了Sun表排序示例中提到的所有可能性,它们都在工作。
不幸的是,表排序中仍然存在许多错误 。 在此处发布代码之前,您无需做太多工作。 一种可能性是尝试SwingX解决方案 。
我在你的编辑中解决了你的问题:
package jtableheadermouseevent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
*
* @author martijn
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame fr = new JFrame("JTable Header Mouse Listener");
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable();
JScrollPane pane = new JScrollPane(table);
String[][] data = {{"Foo", "Bar"}, {"Baz", "Coffee"}};
String[] columns = {"Header 0", "Header 1"};
DefaultTableModel model = new DefaultTableModel(data, columns);
table.setModel(model);
fr.add(pane);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
System.out.println("Header clicked : (X: " + e.getX() + ", Y: " + e.getY() + ") With button " + e.getButton() );
int header = table.getTableHeader().columnAtPoint(e.getPoint());
System.out.println("This means header " + header + " is clicked!");
}
});
fr.pack();
fr.setSize(800, 300);
fr.setVisible(true);
}
}
这在Linux中很完美,所以我想在OSX和Windows上也是如此。 我在调整列大小后也对它进行了测试:它仍然知道哪些列被按下了。 但在重新排序列之后,第一列“第0列”的列变为“第1列”。
但是你始终可以禁止用户使用以下方法移动列:
table.getTableHeader().setReorderingAllowed(false);
希望这可以帮助
尝试这个:
public abstract class BaseTable extends JTable {
public BaseTable() {
init();
..
}
protected boolean sortableDisable() {
return false;
}
private void init() {
TableRowSorter<BaseTableModel> sorter =
new TableRowSorter<BaseTableModel>(tableModel);
if (sortableDisable()) {
setAutoCreateRowSorter(false);
for (int c = 0; c < tableModel.getColumnCount(); c++) {
sorter.setSortable(c, false);
}
}
setRowSorter(sorter);
..
}
}
public class TableX extends BaseTable() {
@Override
protected boolean sortableDisabled() {
return true;
}
..
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.