Java Swing Tutorial - Java Swing Drag and Drop
Java Swing Tutorial - Java Swing Drag and Drop
DataFlavor[] getTransferDataFlavors()
boolean isDataFlavorSupported(DataFlavor flavor)
Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOExcept
ion
myComponent.setDragEnabled(true);
All text components (JFileChooser, JColorChooser, JList, JTree, and JTable) have
built-in drag support for DnD.
For example, suppose we have a JTextField named nameFld and a JTextArea named
descTxtArea. To start using DnD between them, we need to write the following two
lines of code:
nameFld.setDragEnabled(true);
descTxtArea.setDragEnabled(true);
We can select text in the JTextField, drag it, and drop it onto the JTextArea. The
selected text in the JTextField is transferred to the JTextArea. we can also drag text
from the JTextArea to the JTextField.
Transfer Actions are represented by the constants declared in the TransferHandler
class:
TranferHandler.COPY
TranferHandler.MOVE
TranferHandler.COPY_OR_MOVE
TranferHandler.LINK
TranferHandler.NONE
data:text/html;charset=utf8,%3Ch1%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%2020px%200px%2010px%3B%20fontsize%3… 1/4
24/1/2015 Java Swing Tutorial Java Swing Drag and Drop
Example
The following code shows how to use DnD to Transfer Data Between Swing
Components
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
/* www. jav 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();
data:text/html;charset=utf8,%3Ch1%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%2020px%200px%2010px%3B%20fontsize%3… 2/4
24/1/2015 Java Swing Tutorial Java Swing Drag and Drop
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;
}
data:text/html;charset=utf8,%3Ch1%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%2020px%200px%2010px%3B%20fontsize%3… 3/4
24/1/2015 Java Swing Tutorial Java Swing Drag and Drop
@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;
}
}
data:text/html;charset=utf8,%3Ch1%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%2020px%200px%2010px%3B%20fontsize%3… 4/4