拖放(DnD)是一种在应用程序中传输数据的方法。
DnD允许我们通过拖动组件并将其拖放到另一个组件上来传输数据。
拖动的组件称为拖动源;它提供要传送的数据。
被丢弃的组件称为丢弃目标; 它是数据的接收者。
数据传输使用Transferable对象完成。
Transferable是java.awt.datatransfer包中的一个接口。
Transferable接口包含以下三种方法:
DataFlavor[] getTransferDataFlavors() boolean isDataFlavorSupported(DataFlavor flavor) Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
启用对组件的拖动
myComponent.setDragEnabled(true);
所有文本组件(JFileChooser,JColorChooser,JList,JTree和JTable)都具有对DnD的内置拖动支持。
例如,假设我们有名为nameFld的JTextField和名为descTxtArea的JTextArea。 要开始在它们之间使用DnD,我们需要编写以下两行代码:
nameFld.setDragEnabled(true); descTxtArea.setDragEnabled(true);
我们可以在JTextField中选择文本,拖动它,并将其拖放到JTextArea。 在JTextField中选择的文本被转移到JTextArea。 我们还可以将文本从JTextArea拖动到JTextField。
传递操作由TransferHandler类中声明的常量表示:
以下代码显示如何使用DnD在Swing组件之间传输数据
import java.awt.BorderLayout; import java.awt.Container; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; //from ww w .j av a 2 s .c o m import javax.swing.Box; import javax.swing.DefaultListModel; import javax.swing.DropMode; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; public class Main extends JFrame { private JTextField newTextField = new JTextField(10); private JList<String> sourceList = new JList<>(new DefaultListModel<>()); private JList<String> destList = new JList<>(new DefaultListModel<>()); public Main() { for (int i = 0; i < 15; i++) { ((DefaultListModel<String>) sourceList.getModel()).add(i, "A " + i); ((DefaultListModel<String>) destList.getModel()).add(i, "B " + i); } Box nameBox = Box.createHorizontalBox(); nameBox.add(new JLabel("New:")); nameBox.add(newTextField); Box sourceBox = Box.createVerticalBox(); sourceBox.add(new JLabel("Source")); sourceBox.add(new JScrollPane(sourceList)); Box destBox = Box.createVerticalBox(); destBox.add(new JLabel("Destination")); destBox.add(new JScrollPane(destList)); Box listBox = Box.createHorizontalBox(); listBox.add(sourceBox); listBox.add(destBox); Box allBox = Box.createVerticalBox(); allBox.add(nameBox); allBox.add(listBox); this.getContentPane().add(allBox, BorderLayout.CENTER); sourceList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); destList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); newTextField.setDragEnabled(true); sourceList.setDragEnabled(true); destList.setDragEnabled(true); sourceList.setDropMode(DropMode.INSERT); destList.setDropMode(DropMode.INSERT); sourceList.setTransferHandler(new ListTransferHandler()); destList.setTransferHandler(new ListTransferHandler()); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { Main frame = new Main(); frame.pack(); frame.setVisible(true); }); } } class ListTransferHandler extends TransferHandler { @Override public int getSourceActions(JComponent c) { return TransferHandler.COPY_OR_MOVE; } @Override protected Transferable createTransferable(JComponent source) { JList<String> sourceList = (JList<String>) source; String data = sourceList.getSelectedValue(); Transferable t = new StringSelection(data); return t; } @Override protected void exportDone(JComponent source, Transferable data, int action) { @SuppressWarnings("unchecked") JList<String> sourceList = (JList<String>) source; String movedItem = sourceList.getSelectedValue(); if (action == TransferHandler.MOVE) { DefaultListModel<String> listModel = (DefaultListModel<String>) sourceList .getModel(); listModel.removeElement(movedItem); } } @Override public boolean canImport(TransferHandler.TransferSupport support) { if (!support.isDrop()) { return false; } return support.isDataFlavorSupported(DataFlavor.stringFlavor); } @Override public boolean importData(TransferHandler.TransferSupport support) { if (!this.canImport(support)) { return false; } Transferable t = support.getTransferable(); String data = null; try { data = (String) t.getTransferData(DataFlavor.stringFlavor); if (data == null) { return false; } } catch (Exception e) { e.printStackTrace(); return false; } JList.DropLocation dropLocation = (JList.DropLocation) support .getDropLocation(); int dropIndex = dropLocation.getIndex(); JList<String> targetList = (JList<String>) support.getComponent(); DefaultListModel<String> listModel = (DefaultListModel<String>) targetList .getModel(); if (dropLocation.isInsert()) { listModel.add(dropIndex, data); } else { listModel.set(dropIndex, data); } return true; } }
Java Swing教程 -JLabel JLabel 表示标签,即用于不可编辑的文本的显示区域。 JLabel 可以显示文本和图像。它甚至可以渲染HTML标...
通用CRUD封装BaseMapper接口,为Mybatis-Plus启动时自动解析实体表关系映射转换为Mybatis内部对象注入容器泛型T为任意实...
MyBatis-Plus 条件构造器-AbstractWrappernested(ConsumerParam consumer)nested(boolean condition, ConsumerParam consumer)正...
JSP教程 -JSP HelloWorld设置Java开发工具包首先,从Oracle的Java站点下载Java软件开发工具包(JDK),并相应地设置PATH环境变量。...
JSP教程 -JSP JavaBeansJavaBean是遵循JavaBeans API规范的Java代码。JavaBean具有以下功能。它有一个默认的无参数构造函数。它...