6

プロジェクトで Java 1.3/1.4 以降に使用されている JTable 拡張機能があり、列の並べ替えや列をクリックすることによる並べ替えなどを提供していました。Java 1.6 にアップグレードしていますが、新しい JTable によって古いソート コードが機能しなくなります。すべてを新しい JTable API に適合させるには、多少大がかりな作り直しが必要です。それまでは、JTable でこれらの追加を完全に無効にする方法はありますか?

編集: さらに調査した結果、問題は、ヘッダーのマウス イベントが 1.6 の Swing によって飲み込まれ、レンダリングされた独自のヘッダーが設定されていても、テーブルの実装に渡されないという事実に集中しています。自慢の Java 下位互換性についてはこれで終わりです。

JTable 1.6 を停止させる方法はありますか? できていません。テーブルの UI とテーブル ヘッダーをオーバーライドしても役に立ちませんでした。

4

8 に答える 8

4

JTable.setRowSorter(null)を試しましたか?

edit :およびsetAutoCreateRowSorter ? (1. テーブルを作成する、2. 行ソーターを null に設定する、3. 自動作成ソーターを false に設定する、4. モデルを設定する)。

于 2010-07-22T20:58:38.587 に答える
3

これを 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それらのイベントでやりたいことが何でもできます。私はRowSorterJTable に実装を設定していませんが、これは Java 5 および Java 6 で完全に機能します。

このクラスの完全なソースコードについては、QueueTable.java を参照してください

于 2010-07-25T21:27:03.140 に答える
2

私が理解しているように、ここには2つの問題があります。

  1. JTable の新しい並べ替えコードのため、並べ替えが機能しません。
  2. による並べ替えを無効にするsetRowSorter(null)か、何もしないようにオーバーライドしsetRowSorter(TableRowsorter)ても機能しません。ヘッダーのイベントが JTable に渡されないためです。

その場合、並べ替えコードを TableRowSorter として実装するだけのオプションがあると思います。並べ替えコードがどれほど複雑で、TableRowSorter API をマップできるかどうかはわかりませんが、これは試すことができるもう 1 つの代替手段のようです。

于 2010-08-01T05:12:13.833 に答える
1
JTable.setAutoCreateRowSorter(false);

TableRowSorter がどこかに設定されていない限り、呼び出す必要はないと思いますsetRowSorter(null)

于 2010-07-23T21:28:08.367 に答える
1

ヘッダーをクリックしたときに並べ替えを無効にする方法は、すべてのテーブル ヘッダーのリスナーを削除することです。

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

次に、他の特定のアクション (列のサイズ変更など) が必要な場合は、その特定のアクションに特定のリスナーを追加するだけです。

于 2010-09-07T12:23:30.480 に答える
0

私はあなたの編集であなたの問題を解決しました:

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

お役に立てれば

于 2010-08-01T10:27:33.267 に答える
0

Sun テーブルの並べ替えの例でここに記載されているすべての可能性をテストしましたが、それらはすべて機能しています。

残念ながら、テーブルの並べ替えにはまだ多くのバグがあります。ここにコードを投稿するまで、できることはあまりありません。1 つの可能性は、 SwingX ソリューションを試すことです。

于 2010-08-01T07:02:34.493 に答える
0

これを試して:

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;
    }
    ..
}
于 2011-06-30T10:34:06.163 に答える