【问题标题】:Dragging node from JTree and dropping onto JLabel to perform an action将节点从 JTree 拖放到 JLabel 上以执行操作
【发布时间】:2011-10-07 08:50:58
【问题描述】:

我想在我的系统上实现 DnD,方法是将一个节点从 JTree 拖放到 JLabel 上。

JLabel 是一个具有某些机器属性的图标,通过将信息从 JTree 节点拖到 JLabel 上,我希望它能够向在该机器上侦听的客户端发送消息。

非常感谢任何帮助!

标签方法示例:

private void makeLabel(String html, final String version) {
    // Create a button to link to the DR environment
    //JButton button = new JButton(html);
    JLabel machineLabel = new JLabel();
    machineLabel.setTransferHandler(new TransferHandler("text"));
    MouseListener listener = new DragMouseAdapter();
    machineLabel.addMouseListener(listener);
    machineLabel.setIcon(onlineIcon);
    machineLabel.setToolTipText("IP: " + html);
    //Add the button to the panel and make sure it appears
    machineLabel.setSize(25, 10);
    vecIcons.addElement(machineLabel);
    buttonPanel.add(machineLabel);
    buttonPanel.setVisible(true);
    buttonPanel.validate();
    dynaScrollPane.validate();
    buttonPanel.repaint();
    dynaScrollPane.repaint();
  }

DragMouseAdapter 方法:

    private class DragMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
  JComponent c = (JComponent) e.getSource();
  TransferHandler handler = c.getTransferHandler();
  handler.exportAsDrag(c, e, TransferHandler.LINK);
  }
}

然后为了使我的树可拖动,我只需要:

exampleTree.setDragEnabled(true);

【问题讨论】:

  • 这可能对您有帮助:Drag and Drop and Data Transferthis example
  • 我相信这是常规的Java DnD support
  • 我确实尝试了按照 Java 教程提供的代码,但它并不能真正与 jLabels 一起使用,而是将控制字符串放在标签旁边,而不是放在标签上。
  • 这听起来更像是 Swing 渲染的问题,而不是 DnD 的问题。你能发一个scce吗?
  • 我刚刚把所有相关的方法和代码都贴在原帖里了。

标签: java swing drag-and-drop applet jtree


【解决方案1】:

不确定我是否理解您的设置:假设您希望标签成为放置目标,只需实现一个自定义 Transferhandler 即可接受树导出的数据风味并对其进行处理

编辑

要获取 TreePath,也可以在树上使用自定义 Transferhandler:覆盖它的 createTransferable,它会返回 TreePath:

    final DataFlavor flavor =new DataFlavor(TreePath.class, "treePath");
    TransferHandler treeHandler = new TransferHandler() {
        DataFlavor[] pathFlavour = new DataFlavor[] 
                  {flavor};

        /** 
         * @inherited <p>
         */
        @Override
        protected Transferable createTransferable(JComponent c) {
            JTree tree = (JTree) c;
            final TreePath path = tree.getSelectionPath();
            Transferable transferable = new Transferable() {

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

                @Override
                public boolean isDataFlavorSupported(DataFlavor flavor) {
                    return pathFlavour[0].equals(flavor);
                }

                @Override
                public Object getTransferData(DataFlavor flavor)
                        throws UnsupportedFlavorException, IOException {
                    return path;
                }

            };
            return transferable;
        }

        public int getSourceActions(JComponent c) {
            return COPY;
        }

    };
    tree.setTransferHandler(treeHandler);
    JLabel labelTarget = new JLabel("I'm a drop target!");
    TransferHandler labelHandler = new TransferHandler() {

        /** 
         * @inherited <p>
         */
        @Override
        public boolean importData(JComponent comp, Transferable t) {
            try {
                LOG.info("import from: " +  t.getTransferData(flavor));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }

        /** 
         * @inherited <p>
         */
        @Override
        public boolean canImport(JComponent comp,
                DataFlavor[] transferFlavors) {
            return true;
        }

    };
    labelTarget.setTransferHandler(labelHandler);

不需要额外的 mouseListener

【讨论】:

  • 真;我记得,所有相关的鼠标事件都由 java.awt.dnd 处理。
  • 这很好用,虽然我需要能够找出下降的确切位置。因此,例如,如果我有一棵树,其根节点为“Server1”,然后在其下的另一个节点称为“Example”,其中有一个名为“Example Val”的值,我怎样才能让它显示类似“阻力来自 Server1->Example->Example Val”?我找不到使用 DataFlavors 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多