JTable - glisser et déposer
OK, ce problème est hors de ma ligue. Je suis en train de mettre en œuvre une interface graphique widget de swing qui permet aux fichiers d'être tombé sur une JTable, et permet de les lignes de la JTable, traîné pour re-trier. Pensez VLC listes de lecture, ou l'un dans iTunes.
J'ai déposer des fichiers à partir du système d'exploitation (Explorer, Finder, etc.) fonctionne très bien, mais je vais avoir un impossible de temps à ré-organiser les lignes de la table, une fois que les fichiers sont en. Le problème est que lorsque j'ajoute une coutume TransferHandler à la table, en faisant glisser de la table est tué sur le coup. Voici un exemple de code:
import javax.swing.*;
public class TableTest
{
public static void main (String [] argv)
{
//setup table data
String [] columns = new String [] {"Foo", "Bar", "Baz", "Quux"};
String [][] data = new String [][] {{"A", "B", "C", "D"},
{"1", "2", "3", "4"},
{"i", "ii", "iii", "iv"}};
//create table
JTable table = new JTable(data, columns);
//set up drag and drop
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setFillsViewportHeight(true);
TransferHandler dnd = new TransferHandler() {
//here be code to handle drops, and one would
//presume drag exporting, too
};
table.setTransferHandler(dnd);
JScrollPane scroll = new JScrollPane(table);
//create and show window
JFrame window = new JFrame();
window.getContentPane().add(scroll);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
D'exécuter ce code et vous verrez que vous ne pouvez pas lancer un glisser sur la table.Si vous en commentaire l'appel à setTransferHandler() sur la table, en faisant glisser les œuvres (c'est à dire, quand j'ai commencer à faire glisser une ligne de la table, j'ai le X une suite curseur de cercle en disant que je ne peut pas laisser tomber). Mais dès qu'un TransferHandler est défini pour la table, je ne peux pas faire glisser les lignes. Le problème doit être dans le TransferHandler, mais j'ai complètement dépannés et débogué, et ont déterminé que le déplacement n'a jamais commencé une fois il y a un TransferHandler sur la table. Ce que je fais mal?
source d'informationauteur stdave
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, il n'a rien à voir avec votre personnalisé de mise en œuvre de la TransferHandler. Lorsque vous remplacez le TransferHandler vous devez également obtenir une prise de la valeur par défaut DragSource et dites-lui de reconnaître en le faisant glisser. Vous pouvez aussi avoir besoin de mettre en place votre propre Transférable, car vous aurez besoin de passer à la DragGestureEvent.méthode startDrag ().
Il ne semble pas que vous êtes à l'aide de la TransferHandler correctement. Essayez de lire le tutoriel ici.
Voir le TransferHandler doc ici. Le constructeur vide n'a pas l'air comme il est destiné pour une utilisation à l'extérieur d'une sous-classe de TransferHandler.
Et de ne pas mettre en œuvre toutes les fonctionnalités prévues dans la norme TransferHandler fournies sur les composants Swing. Voir extrait du Mdn tutoriel ici (mon gras):
Je pense que le problème est que le vide TransferHandler fait empêche le Mdn événements de se produire. Il y a un exemple ici qui peuvent être pertinentes.
http://www.java2s.com/Code/Java/Swing-JFC/ExtendedDnDDragandDropDemo.htm
Je ne veux pas entrer dans les écrous et les boulons de ce qui se passait si je viens de délégation les méthodes que je n'étais pas intéressé à la vieille TransferHandler.
Commencez avec une configuration standard, mais passer les vieux TransferHandler dans votre personnalisé TransferHandler.
Une chasse aux sorcières, c'est que createTransferable(JComponent) et exportDone(JComponent, Transférable, int) méthodes sont protégés de façon à ce que vous devez faire la réflexion afin de déléguer à ces méthodes. Quand je n'ai pas fait cette réflexion délégation à la stratégie n'a pas fonctionné. Une fois que j'ai fait cette délégation de glisser et déposer a fonctionné comme prévu, sans changer la DragSource ou d'avoir à écrire une nouvelle Transférables.