6
votes

Comment pouvez-vous désactiver tout le code de tri dans JTable en 1.6

J'ai une extension JTable utilisée depuis Java 1.3 / 1.4 dans le projet qui fournissait des éléments tels que la réorganisation des colonnes et le tri en cliquant sur la colonne. Nous mettons à niveau vers Java 1.6 et la nouvelle JTABLE arrête l'ancien code de tri de travail. Ce serait un peu important de retravailler pour tout adapter à la nouvelle API JTAble. Jusque-là, il y a un moyen de désactiver complètement ces ajouts dans JTABLE?

Edit: Après la poursuite de l'enquête, le problème est centré sur le fait que les événements de la souris sur l'en-tête sont avalés par balançoire en 1.6 et ne sont pas transmis à la mise en œuvre de la table, même s'il définit son propre en-tête rendu. Voilà pour la compatibilité de Java vanté de Java.

Voilà donc un moyen de faire arrêter JTable 1.6? Je n'ai pas pu. Même remplacer l'interface utilisateur sur la table et l'en-tête de la table n'a pas aidé.


1 commentaires

J'ai testé cela sur l'exemple du soleil et la table.Setrowsorter (NULL) fonctionne. Pourriez-vous entrer votre exemple de code afin que tout le monde puisse le tester?


8 Réponses :


4
votes

Avez-vous essayé JTAble.Setrowsorter (NULL) ?

edit: et SETAutOrtOrweRowsorter ? (1. Créer une table, 2. Trieur de ligne à NULL, 3. Soreur autocréate à False, 4. Définir le modèle).


2 commentaires

Oui, malheureusement ça n'a pas aidé :(


Malheureusement, cela n'a pas aidé non plus. J'ai même dû faire pirater cette composante car elle a toujours appelé le super qui passe un modèle, de sorte que cela appelle le modèle ultérieurement. Toujours pas de dés :(



1
votes
JTable.setAutoCreateRowSorter(false);
Unless the TableRowSorter is set somewhere, I don't think that you have to call setRowSorter(null)

0 commentaires

3
votes

Je l'utilise dans ma sous-classe JTAble et cela attrape des événements de souris juste bien: XXX PRE>

Le type SortColumnlistener code> est mis en œuvre comme suit: P>

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
        }
    }
}


5 commentaires

Oui, j'ai également observé cela. Vous pouvez également ajouter votre propre auditeur. Mais dans Java 1.5, je pense que le point était qu'un événement de souris sur l'en-tête ou sur la table était également propagé sans un auditeur spécial sur l'en-tête. Au moins je le pense.


Ils ont peut-être très bien été, mais je considérerais qu'un détail de mise en œuvre et non une promesse de l'API. Ajout d'un mouselistener à la tête de table a toujours été "le" moyen de faire cela afaik.


Malheureusement, même en ajoutant explicitement un auditeur et pompant la souris même à travers ce composant (et j'ai débogué - il pense qu'il s'agit d'un événement de souris régulier) toujours ne reçoit pas la table pour trier. Soupir.


Au fait, merci pour le code. En ce qui concerne votre SortColumnlistner, ne devriez-vous pas utiliser JTAble.columnatPoint? Sauf si vous supposez que les colonnes ne sont jamais réorganisées sur la table.


Les colonnes ne sont en effet jamais réorganisées sur cette table particulière. La mise en page est corrigée.



2
votes

Si je comprends bien, vous avez deux problèmes ici:

  1. En raison du nouveau code de tri en JTAble, votre tri ne fonctionne pas.
  2. Même si vous désactivez le tri par SETROWOWORTER (NULL) ou en remplaçant le SETROWROSORTER (TAPEROWORSORTER) Pour ne rien faire, cela ne fonctionne pas car les événements sur l'en-tête ne sont pas passé à votre jtalle.

    Dans ce cas, je pense que l'option pour vous est de simplement avoir votre code de tri mis en œuvre comme Tablerowsorter . Je ne suis pas conscient à quel point votre code de tri complexe est complexe et que cela puisse mapper l'API Tablerowsorter, mais cela semble être une autre alternative que vous pouvez essayer.


0 commentaires

0
votes

J'ai testé toutes les possibilités mentionnées ici sur Exemple de tri de table Sun et ils fonctionnent tous.

Malheureusement, il y a encore Beaucoup de bugs Tri de table . Il ne peut y avoir grand chose que lorsque vous publiez votre code ici. Une possibilité est d'essayer Shanwx Solution .


1 commentaires

Merci, malheureusement, le composant qui s'est cassé est propriétaire et, bien que nous ayons acheté le code source, je ne peux pas la publier ici.



0
votes

J'ai résolu votre problème dans votre édition: xxx

Ceci fonctionne parfaitement sous Linux, donc je suppose également sur OSX et Windows. Je l'ai également testé après avoir redimensionné les colonnes: elle sait toujours quelles colonnes ont été enfoncées. Mais après la réorganisation des colonnes, la colonne qui a été la première "colonne 0" est devenue "colonne 1".
Mais vous pouvez toujours interdire à l'utilisateur de déplacer les colonnes avec ceci: xxx

espère que cela aide


1 commentaires

Oui, cela me permet d'ajouter un auditeur supplémentaire. Malheureusement, cela n'a pas corrigé le comportement.



1
votes

Un moyen de désactiver le tri lorsque vous cliquez sur l'en-tête, consiste à supprimer tous les auditeurs de l'en-tête de la table: xxx

au cas où vous voulez une autre action spécifique (comme la résolution de la colonne). Ajoutez simplement un auditeur spécifique pour cette action particulière.


0 commentaires

0
votes

Essayez ceci:

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 commentaires