Как реализовать интеллектуальное перетаскивание с одного JTree на другой?

У меня есть два JTrees с некоторыми фиктивными данными, что я хочу сделать, так это иметь возможность взять каждое «Задание» (15663-1, 15663-2 , и т. д.) и создайте узел для каждого, с узлом для каждой части под ним и компонентами, прикрепленными к каждой части под ним. В двух деревьях, например так:

+------------------------------+------------------------------+
| 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]    |
+------------------------------+------------------------------+

Итак, предположим, что у меня есть два винта в крышке в задании A в дереве j "детали, подлежащие отправке", и у меня нет ничего в задании A в упаковочной коробке, когда я перетаскиваю винты к упаковочной коробке, он должен сделать запись для jobA, сделать запись для части A и сделать запись для компонента, затем я хочу, чтобы он запрашивал количество для этого компонента и вычитал это количество из частей, которые должны быть отправлены дерево.

Таким образом, если у меня есть работа под названием 1553-4, и у нее есть крышка с четырьмя винтами, и я перетаскиваю винты в транспортировочную коробку, тогда в транспортной коробке должна быть запись, которая говорит «x винты», а затем запрашивается пользователь должен ввести количество винтов, которые они только что упаковали, если они упаковывают два винта, тогда jtree должно измениться, чтобы отразить 2 винта, оставшихся для этой работы.

Я прочитал кучу различных руководств по перетаскиванию и у меня есть несколько примеров, но я просто не могу их понять. Любые советы или помощь будут оценены.

Я знаю, что мне нужно реализовать TranferHandler, но я не уверен, как именно, кажется, что происходит слишком много «волшебства» интерфейса, и я действительно не понимаю этого.

Вот что у меня есть, я понимаю создание узлов и тому подобное, вот что у меня есть:

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

Я просто ищу краткий пример перетаскивания в JTree и перетаскивания из JTree.

5
задан davidahines 3 April 2012 в 21:03
поделиться