Java Swing拖放
2018-01-09 19:23 更新
Java Swing教程 - Java Swing拖放
拖放(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类中声明的常量表示:
- TranferHandler.COPY
- TranferHandler.MOVE
- TranferHandler.COPY_OR_MOVE
- TranferHandler.LINK
- TranferHandler.NONE
例子
以下代码显示如何使用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;
}
}
以上内容是否对您有帮助:

免费 AI IDE


更多建议: