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? P>
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. P>
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é. P>
8 Réponses :
Avez-vous essayé JTAble.Setrowsorter (NULL) ? P>
edit: strong> et SETAutOrtOrweRowsorter ? (1. Créer une table, 2. Trieur de ligne à NULL, 3. Soreur autocréate à False, 4. Définir le modèle). P>
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 :(
JTable.setAutoCreateRowSorter(false); Unless the TableRowSorter is set somewhere, I don't think that you have to call setRowSorter(null)
Je l'utilise dans ma sous-classe JTAble et cela attrape des événements de souris juste bien: 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
}
}
}
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 i> 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.
Si je comprends bien, vous avez deux problèmes ici: P>
SETROWOWORTER (NULL) CODE> ou en remplaçant le SETROWROSORTER (TAPEROWORSORTER) CODE> Pour ne rien faire, cela ne fonctionne pas car les événements sur l'en-tête ne sont pas passé à votre jtalle. li>
ol>
Dans ce cas, je pense que l'option pour vous est de simplement avoir votre code de tri mis en œuvre comme Tablerowsorter Strong>. 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. P>
J'ai testé toutes les possibilités mentionnées ici sur Exemple de tri de table Sun et ils fonctionnent tous. P>
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 . P>
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.
J'ai résolu votre problème dans votre édition: 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". espère que cela aide p> p>
Mais vous pouvez toujours interdire à l'utilisateur de déplacer les colonnes avec ceci: p>
Oui, cela me permet d'ajouter un auditeur supplémentaire. Malheureusement, cela n'a pas corrigé le comportement.
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: 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. P> p>
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; } .. }
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?