Как вы можете отключить все сортировки кода в JTable в 1.6 - PullRequest
6 голосов
/ 23 июля 2010

У меня есть расширение JTable, которое используется с Java 1.3 / 1.4 в проекте, которое обеспечивало такие вещи, как переупорядочение и сортировка столбцов, нажав на столбец. Мы выполняем обновление до Java 1.6, и новый JTable останавливает работу старого кода сортировки. Было бы довольно сложно переделать все под новый JTable API. До этого времени есть способ полностью отключить эти добавления в JTable?

Редактировать: После дальнейшего исследования проблема сконцентрирована вокруг того факта, что события мыши на заголовке проглатываются Swing в 1.6 и не передаются реализации таблицы, даже если он устанавливает свой собственный обработанный заголовок. Вот вам и хваленая обратная совместимость с Java.

Так есть ли способ заставить JTable 1.6 остановиться? Я не смог. Даже переопределение пользовательского интерфейса таблицы и заголовка таблицы не помогло.

Ответы [ 8 ]

4 голосов
/ 23 июля 2010

Вы пробовали JTable.setRowSorter (null) ?

редактировать: и setAutoCreateRowSorter ?(1. создать таблицу, 2. сортировать строки по нулю, 3. автоматически создать сортировку по ложному, 4. установить модель).

3 голосов
/ 26 июля 2010

Я использую это в своем подклассе 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 просто отлично, и я могу делать все, что захочу с этими событиями.У меня нет реализации RowSorter для JTable, и это прекрасно работает в Java 5 и Java 6.

Полный исходный код этого класса см .: QueueTable.java

2 голосов
/ 01 августа 2010

Насколько я понимаю, у вас есть две проблемы:

  1. Из-за нового кода сортировки в JTable ваша сортировка не работает.
  2. Даже если вы отключите сортировку с помощью setRowSorter(null) или путем переопределения setRowSorter(TableRowsorter), чтобы он ничего не делал, он не работает, потому что события в заголовке не передаются в JTable.

В этом случае я думаю, что вариант для вас - просто ваш код сортировки реализован как TableRowSorter .Я не знаю, насколько сложен ваш код сортировки и может ли он отображать API TableRowSorter, но, похоже, это еще одна альтернатива, которую вы можете попробовать.

1 голос
/ 07 сентября 2010

Чтобы отключить сортировку при нажатии на заголовок, нужно удалить всех слушателей заголовка таблицы:

        for(MouseListener listener : table.getTableHeader().getMouseListeners()){
        table.getTableHeader().removeMouseListener(listener);
    }

Тогда, если вам нужно какое-то другое конкретное действие (например, изменение размера столбца), вы можете просто добавить определенного слушателя для этого конкретного действия.

1 голос
/ 24 июля 2010
JTable.setAutoCreateRowSorter(false);

Если TableRowSorter не установлен где-то, я не думаю, что вам нужно вызывать setRowSorter(null)

0 голосов
/ 30 июня 2011

Попробуйте это:

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;
    }
    ..
}
0 голосов
/ 01 августа 2010

Я решил вашу проблему в вашем редакторе:

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);

Надеюсь, это поможет

0 голосов
/ 01 августа 2010

Я протестировал все возможности, упомянутые здесь на примере сортировки таблицы Sun , и все они работают.

К сожалению, все еще много ошибок в сортировке таблиц . Там не может быть много сделано, пока вы не разместите свой код здесь. Одна из возможностей - попробовать SwingX решение .

...