繁体   English   中英

如何在1.6中禁用JTable中的所有排序代码

[英]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

据我了解,你有两个问题:

  1. 由于JTable中的新排序代码,您的排序不起作用。
  2. 即使您通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM