Tengo dos JTrees con algunos datos falsos, lo que estoy buscando hacer es poder tomar cada 'Trabajo' (15663-1, 15663-2, etc.) y hacer un nodo para cada uno, con un nodo para cada parte debajo de él y los componentes unidos a cada parte debajo de eso. En dos árboles, como este:¿Cómo implemento la función de arrastrar y soltar inteligente de un JTree a otro?
+------------------------------+------------------------------+
| PARTS TO BE SHIPPED | SHIPPING BOX |
+------------------------------+------------------------------+
|[JOB] |[JOB] |
|+------[part] |+------[part] |
| +------[component] | +------[component] |
| +------[component] | +------[component] |
|+------[part] |+------[part] |
| +------[component] | +------[component] |
|[JOB] |[JOB] |
|+------[part] |+------[part] |
| +------[component] | +------[component] |
| +------[component] | +------[component] |
|+------[part] |+------[part] |
| +------[component] | +------[component] |
+------------------------------+------------------------------+
Así que suponiendo que tengo dos tornillos en la cubierta de trabajo A en las 'partes para ser enviado' JTree y no tengo nada en Joba en la caja de envío, cuando arrastro los tornillos a la caja de envío, debo hacer una entrada para el trabajo A, hacer una entrada para la parte A y hacer una entrada para el componente, luego quiero que solicite la cantidad para ese componente y restar esa cantidad del partes que se enviarán jtree.
Así que si tengo un trabajo llamado 1553-4 y tiene una cubierta con cuatro tornillos y los arrastre a la caja de envío, entonces debe hacer una entrada en la caja de envío que diga "x tornillos" y luego preguntar para que el usuario ingrese la cantidad de tornillos que acaba de empaquetar, si empacan dos tornillos, el jtree debe cambiar para reflejar los 2 tornillos restantes para ese trabajo.
He leído un montón de diferentes tutoriales de arrastrar y soltar y tengo algunos ejemplos, pero parece que no puedo obtenerlo. Cualquier consejo o ayuda será apreciada.
Sé que tengo que implementar un TransferHandler pero no estoy seguro de cómo exactamente, parece que hay demasiada 'magia' en la interfaz y realmente no lo estoy entendiendo.
Esto es lo que tengo, entiendo que hacen tales nodos y, esto es lo que tengo:
package com.protocase.examples;
import java.awt.Dimension;
import java.awt.HeadlessException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
/**
* @author DavidH
*/
public class JTreeExample {
public static void main(String[] args) {
addTreesAndDisplay();
}
private static void addTreesAndDisplay() throws HeadlessException {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JTree tree = new JTree(getTreeModel());
tree.setDragEnabled(true);
tree.setPreferredSize(new Dimension(200,400));
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tree);
panel.add(scroll);
JTree secondTree = new JTree(getTreeModel());
secondTree.setPreferredSize(new Dimension(200,400));
secondTree.setDragEnabled(true);
JScrollPane secondScroll = new JScrollPane();
secondScroll.setViewportView(secondTree);
panel.add(secondScroll);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private static DefaultTreeModel getTreeModel() {
MutableTreeNode root = new DefaultMutableTreeNode("15663-1");
DefaultMutableTreeNode cover = new DefaultMutableTreeNode("Cover");
DefaultMutableTreeNode base = new DefaultMutableTreeNode("Base");
root.insert(cover, 0);
root.insert(base, 0);
cover.insert(new DefaultMutableTreeNode("2x PEMS"), 0);
cover.insert(new DefaultMutableTreeNode("2x SCREWS"), 0);
base.insert(new DefaultMutableTreeNode("4x SCREWS"), 0);
base.insert(new DefaultMutableTreeNode("4x HANDLES"), 0);
DefaultTreeModel model = new DefaultTreeModel(root);
return model;
}
}
sólo estoy buscando un lastre concisa y el ejemplo de arrastrar a caer en un JTree y arrastrando desde un JTree.
Esta es una gran explicación. Sé que necesito extender TransferHandler pero ¿necesito extender DataFlavor? Así que necesito extender Transfer Handler en mi lista fuente y hacer que sepa qué hacer para empaquetarlo en una versión transferible (que es una clase que posee un objeto y se extiende Transferible) y luego escribir un segundo manejador de transferencia para el destino (a menos que, por supuesto, el primer manejador de transferencias sepa cómo hacer ambas cosas). ¿Dónde entran los Dataflavors? – davidahines
El DataFlavor es solo una forma de indicar qué tipo de datos está disponible en el 'Transferible' (para el remitente), y para que el receptor solicite un tipo particular de datos. Piense en ello como una especie de etiqueta como en un libro de la biblioteca, donde puede decir "dame el libro de misterio" frente a "dame las cosas románticas" – Robin
Gracias, voy a ver estos tutoriales. – davidahines