我有兩個JTree,裏面有一些模擬數據,我想要做的是能夠把每個'Job'(15663-1,15663-2等)和每個節點做成一個節點節點下面的每個部分以及附着在其下面的每個部分的組件。在兩棵樹,就像這樣:如何實現從一個JTree到另一個JTree的智能拖放?
+------------------------------+------------------------------+
| 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] |
+------------------------------+------------------------------+
成,假定我在工作中的一個蓋子兩個螺絲「的部件被運」 JTree的,我沒有在包裝箱有什麼的職吧,當我將螺絲拖到裝運箱時,它應該爲jobA輸入一個條目,爲A部分輸入一個條目併爲該部件輸入一個條目,然後我希望它提示輸入該部件的數量,並從該部分減去該數量零件將被運送jtree。
因此,如果我有一個叫做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。
這是一個很好的解釋。我知道我需要擴展TransferHandler,但是我需要擴展DataFlavor嗎?所以我需要在我的源列表上擴展Transfer Handler,並讓它知道如何將它打包到一個可轉換的版本中(這是一個擁有對象並擴展Transferable的類),然後爲目的地編寫第二個傳輸處理程序除非第一個傳輸處理程序知道如何做到這一點)? Dataflavors在哪裏進來? – davidahines 2012-04-03 20:47:36
DataFlavor只是一種方法,用於指示'Transferable'(用於發送方)中可用的'種類'數據,以及接收方請求特定類型的數據。可以把它想像成一種類似於圖書館書籍的標籤,在那裏你可以說「給我神祕書」與「給我浪漫的東西」 – Robin 2012-04-03 21:29:54
謝謝,我將會看看這些教程。 – davidahines 2012-04-03 21:55:33