Tôi có hai JTrees với một số dữ liệu mô phỏng trong đó, những gì tôi đang tìm kiếm là có thể lấy từng 'Công việc' (15663-1, 15663-2, vv) và tạo một nút cho mỗi nút cho mỗi phần bên dưới nó và các thành phần được gắn vào mỗi phần bên dưới. Trong hai cây, như thế này:Làm cách nào để triển khai kéo và thả thông minh từ JTree này sang JTree khác?
+------------------------------+------------------------------+
| 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] |
+------------------------------+------------------------------+
Vì vậy mà giả sử tôi có hai ốc vít ở trang bìa trong công việc Một trong 'bộ phận sẽ được xuất xưởng' JTree và tôi không có bất cứ điều gì trong jobA trong hộp vận chuyển, khi tôi kéo các vít vào hộp vận chuyển, nó sẽ tạo một mục nhập cho jobA, tạo một mục nhập cho phần A và tạo mục nhập cho thành phần, sau đó tôi muốn nó nhắc số lượng cho thành phần đó và trừ số lượng đó khỏi các bộ phận được vận chuyển jtree. Vì vậy, nếu tôi có một công việc được gọi là 1553-4 và nó có một bìa với bốn ốc vít và tôi kéo các ốc vít vào hộp vận chuyển sau đó nó sẽ làm cho một mục trong hộp vận chuyển mà nói, "x ốc vít" sau đó nhắc để người dùng nhập số lượng vít mà họ vừa đóng gói, nếu họ đóng gói hai ốc vít thì jtree sẽ thay đổi để phản ánh 2 vít còn lại cho công việc đó.
Tôi đã đọc một loạt các hướng dẫn kéo và thả khác nhau và tôi có một số ví dụ nhưng tôi dường như không thể có được nó. Bất kỳ lời khuyên hoặc trợ giúp nào sẽ được đánh giá cao.
Tôi biết rằng tôi cần phải thực hiện một TranferHandler nhưng tôi không chắc chắn chính xác như thế nào, có vẻ như có quá nhiều giao diện 'ma thuật' xảy ra và tôi thực sự không hiểu nó.
Đây là những gì tôi có, tôi hiểu làm nút và như vậy, đây là những gì tôi có:
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;
}
}
Tôi chỉ tìm kiếm một kéo súc tích và thả ví dụ về cách kéo vào một JTree và kéo từ một JTree.
Đây là giải thích tuyệt vời. Tôi biết tôi cần phải mở rộng TransferHandler nhưng tôi có cần mở rộng DataFlavor không? Vì vậy, tôi cần mở rộng Handler Transfer trên danh sách nguồn của mình và làm cho nó biết phải làm gì để gói nó vào một phiên bản có thể chuyển nhượng (là một lớp sở hữu một đối tượng và mở rộng Transferable) và sau đó viết một trình xử lý truyền thứ hai cho đích (trừ khi tất nhiên người xử lý chuyển giao đầu tiên biết cách làm cả hai)? Dataflavors ở đâu? – davidahines
DataFlavor chỉ là một cách để chỉ ra 'loại dữ liệu' có sẵn trong 'Có thể truyền' (cho người gửi), và cho người nhận yêu cầu một loại dữ liệu cụ thể. Hãy suy nghĩ về nó như một loại nhãn như trên một cuốn sách thư viện, nơi bạn có thể nói "cho tôi cuốn sách bí ẩn" vs "cho tôi những thứ lãng mạn" – Robin
Cảm ơn, tôi sẽ xem các hướng dẫn này. – davidahines