在Java中从JButton拖放到JComponent

我在互联网上搜索了如何将JButton拖放到对象的示例,但我无法使其工作。

我的程序所做的是,当我单击一个按钮时,该对象更新了一个字段(带有selectedobject.setField())。 我希望能够做到这一点,不是通过点击,而是通过拖动JButton。

我怎样才能做到这一点 ? 我找到了这个,我试着输入我的代码:

btn.setTransferHandler(new ImageHandler()); btn.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { JComponent c = (JComponent)e.getSource(); TransferHandler handler = c.getTransferHandler(); handler.exportAsDrag(c, e, TransferHandler.COPY); } }); 

我从这里拿了ImageHandler类。

Drag’n’drop是一个有趣的袋子,松脆,松脆的胡萝卜…没有帮助,因为有一个“核心”API和更新的“转移”API,所以它很容易混淆

以下示例使用“transfer”API,基本上将String值从按钮传输到JLabel

拖动数字

 import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.TransferHandler; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { setLayout(new GridLayout(1, 2)); add(createLeftPanel()); add(createRightPanel()); } protected JPanel createLeftPanel() { JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; for (int index = 0; index < 10; index++) { JButton btn = new JButton(Integer.toString(index + 1)); panel.add(btn, gbc); btn.setTransferHandler(new ValueExportTransferHandler(Integer.toString(index + 1))); btn.addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { JButton button = (JButton) e.getSource(); TransferHandler handle = button.getTransferHandler(); handle.exportAsDrag(button, e, TransferHandler.COPY); } }); } return panel; } protected JPanel createRightPanel() { JPanel panel = new JPanel(new GridBagLayout()); JLabel label = new JLabel("Drop in"); label.setBorder(new CompoundBorder(new LineBorder(Color.DARK_GRAY), new EmptyBorder(20, 20, 20, 20))); label.setTransferHandler(new ValueImportTransferHandler()); panel.add(label); return panel; } } public static class ValueExportTransferHandler extends TransferHandler { public static final DataFlavor SUPPORTED_DATE_FLAVOR = DataFlavor.stringFlavor; private String value; public ValueExportTransferHandler(String value) { this.value = value; } public String getValue() { return value; } @Override public int getSourceActions(JComponent c) { return DnDConstants.ACTION_COPY_OR_MOVE; } @Override protected Transferable createTransferable(JComponent c) { Transferable t = new StringSelection(getValue()); return t; } @Override protected void exportDone(JComponent source, Transferable data, int action) { super.exportDone(source, data, action); // Decide what to do after the drop has been accepted } } public static class ValueImportTransferHandler extends TransferHandler { public static final DataFlavor SUPPORTED_DATE_FLAVOR = DataFlavor.stringFlavor; public ValueImportTransferHandler() { } @Override public boolean canImport(TransferHandler.TransferSupport support) { return support.isDataFlavorSupported(SUPPORTED_DATE_FLAVOR); } @Override public boolean importData(TransferHandler.TransferSupport support) { boolean accept = false; if (canImport(support)) { try { Transferable t = support.getTransferable(); Object value = t.getTransferData(SUPPORTED_DATE_FLAVOR); if (value instanceof String) { Component component = support.getComponent(); if (component instanceof JLabel) { ((JLabel) component).setText(value.toString()); accept = true; } } } catch (Exception exp) { exp.printStackTrace(); } } return accept; } } } 

我已经出去分开TransferHandler允许“拖动”和“放下”版本。 你没有“有”这样做,你“可以”使用一个TransferHandler来执行这两个操作,这取决于你。

您必须修改ValueExportTransferHandler以接受不同的值并修改SUPPORTED_DATE_FLAVOR ,但这些是基础知识

您还可以看一下将JList中的拖放自定义对象转换为JLabel作为另一个示例...