拖放(DnD)是一種在應(yīng)用程序中傳輸數(shù)據(jù)的方法。
DnD允許我們通過拖動組件并將其拖放到另一個組件上來傳輸數(shù)據(jù)。
拖動的組件稱為拖動源;它提供要傳送的數(shù)據(jù)。
被丟棄的組件稱為丟棄目標(biāo); 它是數(shù)據(jù)的接收者。
數(shù)據(jù)傳輸使用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的內(nèi)置拖動支持。
例如,假設(shè)我們有名為nameFld的JTextField和名為descTxtArea的JTextArea。 要開始在它們之間使用DnD,我們需要編寫以下兩行代碼:
nameFld.setDragEnabled(true); descTxtArea.setDragEnabled(true);
我們可以在JTextField中選擇文本,拖動它,并將其拖放到JTextArea。 在JTextField中選擇的文本被轉(zhuǎn)移到JTextArea。 我們還可以將文本從JTextArea拖動到JTextField。
傳遞操作由TransferHandler類中聲明的常量表示:
以下代碼顯示如何使用DnD在Swing組件之間傳輸數(shù)據(jù)
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; } }
更多建議: