2016-09-15 23 views
2

我有一個JTreeDefaultMutableTreeNodes。在某些層次上,這些節點用我自己的可序列化對象初始化爲。總共有兩種不同類型的對象(稱爲「步驟」和「訂單」)。我希望能夠只刪除用這兩個對象中的任何一個初始化的節點。任何其他只是字符串的節點都不應該被丟棄。一個「訂單」可以包含許多「步驟」。我希望能夠將它們拖放到JPanel當它們被插入JList。如果「」被丟棄所有的「步驟」都應該被插入,如果只有一個「步驟」只下降了特定的「步驟」應該被插入。從JTree拖放到具有自己對象的JList

SSCCE below!

的JTree:

tree = new JTree(); 
tree.setShowsRootHandles(true); 
tree.setRootVisible(false); 
tree.setDragEnabled(true); 
tree.setModel(treeModel); 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

的JPanel:

public class TablePanel extends JPanel 
{ 
    private static final long serialVersionUID = 3216206960422611905L; 

    public TablePanel() 
    { 
     super(); 

     setLayout(new MigLayout("", "[grow]", "[][grow]")); 

     JProgressBar progressBar = new JProgressBar(); 
     progressBar.setMaximum(28800); // 8 hours in seconds 
     progressBar.setStringPainted(true); 
     add(progressBar, "cell 0 0,growx"); 

     DefaultListModel<Step> listModel = new DefaultListModel<Step>(); 

     JList<Step> list = new JList<Step>(); 
     list.setModel(listModel); 

     setDropTarget(new DropTarget(this, TransferHandler.COPY, new DropTargetAdapter() 
     { 
      private int index = 0; 
      private int amount = 0; 

      @Override 
      public void drop(DropTargetDropEvent dtde) 
      { 
       amount = 0; 
       index = 0; 
      } 

      @Override 
      public void dragExit(DropTargetEvent dte) 
      { 
       if (listModel.size() > 0) 
       { 
        if (amount == 1) 
        { 
         listModel.remove(index); 
        } 
        else 
        { 
         for (int i = 0; i < amount; i++) 
         { 
          listModel.remove(index + i); 
         } 
        } 

        amount = 0; 
       } 
      } 

      @Override 
      public void dragEnter(DropTargetDragEvent dtde) 
      { 
       try 
       { 
        Transferable tr = dtde.getTransferable(); 
        if (dtde.isDataFlavorSupported(Order.auftragFlavor)) 
        { 
         Order a = (Order) tr.getTransferData(Order.auftragFlavor); // Wrong, how do I get this? 

         dtde.acceptDrag(DnDConstants.ACTION_COPY); 

         amount = a.getSteps().size(); 

        } 
        else if (dtde.isDataFlavorSupported(Step.arbeitsgangFlavor)) 
        { 
         Step ag = (Step) tr.getTransferData(Step.arbeitsgangFlavor); 

         dtde.acceptDrag(DnDConstants.ACTION_COPY); 

         amount = 1; 
        } 
        else 
        { 
         dtde.rejectDrag(); 
        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
        dtde.rejectDrag(); 
       } 
      } 

      @Override 
      public void dragOver(DropTargetDragEvent dtde) 
      { 
       try 
       { 
        Transferable tr = dtde.getTransferable(); 
        if (dtde.isDataFlavorSupported(Order.auftragFlavor)) 
        { 
         Order a = (Order) tr.getTransferData(Order.auftragFlavor); // Wrong, how do I get this? 

         dtde.acceptDrag(DnDConstants.ACTION_COPY); 

         amount = a.getSteps().size(); 
        } 
        else if (dtde.isDataFlavorSupported(Step.arbeitsgangFlavor)) 
        { 
         Step ag = (Step) tr.getTransferData(Step.arbeitsgangFlavor); 

         dtde.acceptDrag(DnDConstants.ACTION_COPY); 

         amount = 1; 
        } 
        else dtde.rejectDrag(); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
        dtde.rejectDrag(); 
       } 
      } 
     }, true, null)); 

     add(list, "cell 0 1,grow"); 
    } 
} 

當你拖動過的JList,則數據應該被插入到列表中給用戶的反饋並有可能發生它在列表中。如果不掉線,應該再次移除。

如何將我的對象拖放到JPanel上,而不是隻是字符串的節點?

編輯: 隨着(String) tr.getTransferData(DataFlavor.stringFlavor)我能夠得到節點的標籤,但這不是真正的幫助,因爲我不知道這是否是一個步驟或只是一個字符串節點。

EDIT2 SSCCE:這僅僅是字符串

public class Test extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 
    private JPanel contentPane; 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        Test window = new Test(); 
        window.setVisible(true); 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public Test() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
     DefaultMutableTreeNode string1 = new DefaultMutableTreeNode("String 1"); 
     DefaultMutableTreeNode order1 = new DefaultMutableTreeNode(new ParentObject()); 
     order1.add(new DefaultMutableTreeNode(new ChildObject())); 
     order1.add(new DefaultMutableTreeNode(new ChildObject())); 

     string1.add(order1); 

     root.add(string1); 

     DefaultTreeModel model = new DefaultTreeModel(root); 

     JTree tree = new JTree(model); 
     tree.setShowsRootHandles(true); 
     tree.setRootVisible(false); 
     tree.setDragEnabled(true); 
     tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
     contentPane.add(tree, BorderLayout.WEST); 

     CustPanel panel = new CustPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 
    } 
} 

class CustPanel extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 

    public CustPanel() 
    { 
     super(); 
     setLayout(new MigLayout("", "[grow]", "[][grow]")); 

     JProgressBar progressBar = new JProgressBar(); 
     add(progressBar, "cell 0 0,growx"); 

     DefaultListModel<ChildObject> listModel = new DefaultListModel<ChildObject>(); 

     JList<ChildObject> list = new JList<ChildObject>(); 
     list.setModel(listModel); 

     setDropTarget(new DropTarget(this, TransferHandler.COPY, new DropTargetAdapter() 
     { 
      @Override 
      public void drop(DropTargetDropEvent dtde) 
      { 
       Transferable tr = dtde.getTransferable(); 
       if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) 
       { 
        try 
        { 
         System.out.println((String) tr.getTransferData(DataFlavor.stringFlavor)); // I want the actual object 
        } 
        catch (UnsupportedFlavorException | IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 

      @Override 
      public void dragExit(DropTargetEvent dte) 
      { 

      } 

      @Override 
      public void dragEnter(DropTargetDragEvent dtde) 
      { 
       Transferable tr = dtde.getTransferable(); 
       if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) 
       { 
        try 
        { 
         System.out.println((String) tr.getTransferData(DataFlavor.stringFlavor)); // I want the actual object 
        } 
        catch (UnsupportedFlavorException | IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 

      @Override 
      public void dragOver(DropTargetDragEvent dtde) 
      { 
       Transferable tr = dtde.getTransferable(); 
       if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) 
       { 
        try 
        { 
         System.out.println((String) tr.getTransferData(DataFlavor.stringFlavor)); // I want the actual object 
        } 
        catch (UnsupportedFlavorException | IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }, true, null)); 

     add(list, "cell 0 1,grow"); 
    } 
} 

class ParentObject implements Serializable 
{ 
    private static final long serialVersionUID = 1279985471254050120L; 

    public ArrayList<ChildObject> getChildren() 
    { 
     return new ArrayList<ChildObject>(); 
    } 

    @Override 
    public String toString() 
    { 
     return "ParentObject"; 
    } 
} 

class ChildObject implements Serializable 
{ 
    private static final long serialVersionUID = -5833860202973614790L; 

    @Override 
    public String toString() 
    { 
     return "ChildObject"; 
    } 
} 
+2

爲了更好地幫助更快,發佈[MCVE]或[短的,獨立的,正確的示例](HTTP://www.sscce。組織/)。 –

+0

我已經添加了一個例子。希望這是足夠的 – TheFreddy1404

回答

2

而不是節點?

您可能可以使用TransferHandler#createTransferable(...)方法獲取DefaultMutableTreeNode

import java.awt.*; 
import java.awt.datatransfer.*; 
import java.awt.dnd.*; 
import java.io.*; 
import java.util.*; 
import javax.activation.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class Test2 { 
    public JComponent makeUI() { 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
    DefaultMutableTreeNode string1 = new DefaultMutableTreeNode("String 1"); 
    DefaultMutableTreeNode order1 = new DefaultMutableTreeNode(new ParentObject()); 
    order1.add(new DefaultMutableTreeNode(new ChildObject())); 
    order1.add(new DefaultMutableTreeNode(new ChildObject())); 
    string1.add(order1); 
    root.add(string1); 

    DefaultTreeModel model = new DefaultTreeModel(root); 
    JTree tree = new JTree(model); 
    tree.setShowsRootHandles(true); 
    tree.setRootVisible(false); 
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
    tree.setTransferHandler(new TreeTransferHandler()); 
    tree.setDragEnabled(true); 

    DefaultListModel<ChildObject> listModel = new DefaultListModel<ChildObject>(); 
    JList<ChildObject> list = new JList<ChildObject>(); 
    list.setModel(listModel); 
    list.setDropTarget(new DropTarget(list, TransferHandler.COPY, new DropTargetAdapter() { 
     private void print(Transferable tr) { 
     try { 
      Object node = tr.getTransferData(TreeTransferHandler.FLAVOR); 
      System.out.println(node); // I want the actual object 
     } catch (UnsupportedFlavorException | IOException ex) { 
      ex.printStackTrace(); 
     } 
     } 
     @Override 
     public void drop(DropTargetDropEvent dtde) { 
     if (dtde.isDataFlavorSupported(TreeTransferHandler.FLAVOR)) { 
      print(dtde.getTransferable()); 
     } 
     } 
     @Override public void dragExit(DropTargetEvent dte) {} 
     @Override public void dragEnter(DropTargetDragEvent dtde) {} 
     @Override public void dragOver(DropTargetDragEvent dtde) {} 
    }, true, null)); 

    JPanel contentPane = new JPanel(new GridLayout(1, 2)); 
    contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
    contentPane.add(new JScrollPane(tree), BorderLayout.WEST); 
    contentPane.add(new JScrollPane(list), BorderLayout.CENTER); 

    return contentPane; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     try { 
      JFrame f = new JFrame(); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.getContentPane().add(new Test2().makeUI()); 
      f.setBounds(100, 100, 450, 300); 
      f.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 
    }); 
    } 
} 

class ParentObject implements Serializable { 
    public ArrayList<ChildObject> getChildren() { 
    return new ArrayList<ChildObject>(); 
    } 
    @Override 
    public String toString() { 
    return "ParentObject"; 
    } 
} 

class ChildObject implements Serializable { 
    @Override 
    public String toString() { 
    return "ChildObject"; 
    } 
} 

class TreeTransferHandler extends TransferHandler { 
    public static final DataFlavor FLAVOR = new ActivationDataFlavor(
    DefaultMutableTreeNode[].class, 
    DataFlavor.javaJVMLocalObjectMimeType, 
    "Array of DefaultMutableTreeNode"); 
    @Override protected Transferable createTransferable(JComponent c) { 
    JTree source = (JTree) c; 
    TreePath[] paths = source.getSelectionPaths(); 
    DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[paths.length]; 
    for (int i = 0; i < paths.length; i++) { 
     nodes[i] = (DefaultMutableTreeNode) paths[i].getLastPathComponent(); 
    } 
    return new DataHandler(nodes, FLAVOR.getMimeType()); 
    } 
    @Override public int getSourceActions(JComponent c) { 
    return TransferHandler.COPY; 
    } 
} 
+0

那幫了很多,謝謝!我閱讀了有關TransferHandler的內容,但並不確定,也不知道如何。我很抱歉,我無法贊成它,因爲我仍然有不到15次的代表。 – TheFreddy1404