Перетаскивание (от JTree до CommandBar) NullPointerException - PullRequest
0 голосов
/ 13 сентября 2018

Я хотел бы использовать метод drog и Drap из Tree и drap в CommandBar (Панель инструментов)

`у меня есть исключение NullPointer в строке

commandBar.setTransferHandler(this);
  commandBar.setDropTarget(dropTarget);

это полный код:

Import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.awt.dnd.DropTarget;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Vector;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JTree;
 import javax.swing.TransferHandler;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeNode;
 import javax.swing.tree.TreePath;
 import javax.swing.tree.TreeSelectionModel;
 import com.jidesoft.action.CommandBar;



     public class TreeTransferHandler extends TransferHandler
  {

DataFlavor nodesFlavor;
DataFlavor[] flavors = new DataFlavor[1];
DefaultMutableTreeNode[] nodesToRemove;
private JTree tree;
private CommandBar[] commandBars;

 public static List<ToolBarContainer> toolbarContainer = new Vector<>();


 DropTarget dropTarget = new DropTarget();

 public TreeTransferHandler(JTree tree, CommandBar... commandBars)
  {
  this.tree = tree;
  this.commandBars = commandBars;
  tree.setDragEnabled(true);

  tree.setTransferHandler(this);
  tree.getSelectionModel().setSelectionMode(
    TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);

for (CommandBar commandBar : commandBars)
{
   commandBar.setTransferHandler(this);
  commandBar.setDropTarget(dropTarget);
}

try
{
  String mimeType = DataFlavor.javaJVMLocalObjectMimeType +
      ";class=\"" +
      javax.swing.tree.DefaultMutableTreeNode[].class.getName() +
      "\"";
  nodesFlavor = new DataFlavor(mimeType);
  flavors[0] = nodesFlavor;
     }
    catch (ClassNotFoundException e)
   {
  System.out.println("ClassNotFound: " + e.getMessage());
    }
   }

 @Override
  public boolean canImport(TransferHandler.TransferSupport support)
   {
   if (!support.isDrop())
  {
    return false;
}
support.setShowDropLocation(true);
if (!support.isDataFlavorSupported(nodesFlavor))
{
  return false;
}

for (CommandBar commandBar : commandBars)
{
  if (support.getComponent() == commandBar)
    return true;
}

return false;
 }

   private boolean haveCompleteNode(JTree tree)
   {
    int[] selRows = tree.getSelectionRows();
   TreePath path = tree.getPathForRow(selRows[0]);
     DefaultMutableTreeNode first =
    (DefaultMutableTreeNode) path.getLastPathComponent();
     int childCount = first.getChildCount();
// first has children and no children are selected.
if (childCount > 0 && selRows.length == 1)
  return false;
// first may have children.
for (int i = 1; i < selRows.length; i++)
{
  path = tree.getPathForRow(selRows[i]);
  DefaultMutableTreeNode next =
      (DefaultMutableTreeNode) path.getLastPathComponent();
  if (first.isNodeChild(next))
  {
    // Found a child of first.
    if (childCount > selRows.length - 1)
    {
      // Not all children of first are selected.
      return false;
    }
  }
}
return true;
   }

 @Override
  protected Transferable createTransferable(JComponent c)
    {
    JTree tree = (JTree) c;
TreePath[] paths = tree.getSelectionPaths();
if (paths != null)
{
  // Make up a node array of copies for transfer and
  // another for/of the nodes that will be removed in
  // exportDone after a successful drop.
  List<DefaultMutableTreeNode> copies =
      new ArrayList<>();
  List<DefaultMutableTreeNode> toRemove =
      new ArrayList<>();
  DefaultMutableTreeNode node =
      (DefaultMutableTreeNode) paths[0].getLastPathComponent();
  DefaultMutableTreeNode copy = copy(node);
  copies.add(copy);
  toRemove.add(node);
  for (int i = 1; i < paths.length; i++)
  {
    DefaultMutableTreeNode next =
        (DefaultMutableTreeNode) paths[i].getLastPathComponent();
    // Do not allow higher level nodes to be added to list.
    if (next.getLevel() < node.getLevel())
    {
      break;
    }
    else if (next.getLevel() > node.getLevel())
    { // child node
      copy.add(copy(next));
      // node already contains child
    }
    else
    { // sibling
      copies.add(copy(next));
      toRemove.add(next);
    }
  }
  DefaultMutableTreeNode[] nodes =
      copies.toArray(new DefaultMutableTreeNode[copies.size()]);
  nodesToRemove =
      toRemove.toArray(new DefaultMutableTreeNode[toRemove.size()]);
  return new NodesTransferable(nodes);
}
return null;
   }

   /** Defensive copy used in createTransferable. */

    private DefaultMutableTreeNode copy(TreeNode node)
     {
DefaultMutableTreeNode n = (DefaultMutableTreeNode) node;
return (DefaultMutableTreeNode) n.clone();

   }

   @Override
   protected void exportDone(JComponent source, Transferable data, int action)
   {
    if ((action & MOVE) == MOVE)
    {
  JTree tree = (JTree) source;
  DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
  // Remove nodes saved in nodesToRemove in createTransferable.
  for (int i = 0; i < nodesToRemove.length; i++)
  {
    model.removeNodeFromParent(nodesToRemove[i]);
  }
}
   }

     @Override
  public int getSourceActions(JComponent c)
   {
   return COPY_OR_MOVE;
  }

     @Override
   public boolean importData(TransferHandler.TransferSupport support)
     {
     if (!canImport(support))
    {
  return false;
}

if (!(support.getComponent() instanceof CommandBar))
  return false;

CommandBar destination = (CommandBar) support.getComponent();

//System.out.println(support.getComponent().getName());
// Extract transfer data.
DefaultMutableTreeNode[] nodes = null;
try
{
  Transferable t = support.getTransferable();
  nodes = (DefaultMutableTreeNode[]) t.getTransferData(nodesFlavor);

  // Get drop location info.

  for (int i = 0; i < nodes.length; i++)
  {
    if (nodes != null)

    {
      Komet3Button but = new Komet3Button(Komet3Function.getToolBarKey(i));

      System.out.println(Komet3Function.getToolBarKey(i));
      destination.add(but);

    }
    //  cc.set(nodes[i])
  }

  Vector<Komet3Function> shownFuncs = new Vector<>();
  for (int i = 0; i < nodes.length; i++)
  {
    //    shownFuncs.add(list.getModel().getElementAt(i));
  }
}
catch (UnsupportedFlavorException ufe)
{
  System.out.println("UnsupportedFlavor: " + ufe.getMessage());
}
catch (java.io.IOException ioe)
{
  System.out.println("I/O error: " + ioe.getMessage());
}

return true;
  }

   @Override
  public String toString()
    {
    return getClass().getName();
   }

   public class NodesTransferable implements Transferable
   {
   DefaultMutableTreeNode[] nodes;

     public NodesTransferable(DefaultMutableTreeNode[] nodes)
{
  this.nodes = nodes;
}

@Override
public Object getTransferData(DataFlavor flavor)
    throws UnsupportedFlavorException
{
  if (!isDataFlavorSupported(flavor))
    throw new UnsupportedFlavorException(flavor);
  return nodes;
}

@Override
public DataFlavor[] getTransferDataFlavors()
{
  return flavors;
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor)
{
  return nodesFlavor.equals(flavor);
}
  }
  }
...