该程序包括两个部分。第一部分是Java Swing代码,它允许拖放String类型。
listModel.addElement("Martha Washington");
listModel.addElement("Abigail Adams");
listModel.addElement("Martha Randolph");
listModel.addElement("Dolley Madison");
listModel.addElement("Elizabeth Monroe");
listModel.addElement("Louisa Adams");
listModel.addElement("Emily Donelson");
list = new JList(listModel);
list.setVisibleRowCount(-1);
list.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
list.setTransferHandler(new TransferHandler() {
public boolean canImport(TransferHandler.TransferSupport info) {
if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
if (dl.getIndex() == -1) {
return false;
}
return true;
}
public boolean importData(TransferHandler.TransferSupport info) {
if (!info.isDrop()) {
return false;
}
if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
displayDropLocation("List doesn't accept a drop of this type.");
return false;
}
JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
DefaultListModel listModel = (DefaultListModel) list.getModel();
int index = dl.getIndex();
boolean insert = dl.isInsert();
String value = (String) listModel.getElementAt(index);
Transferable t = info.getTransferable();
String data;
try {
data = (String) t.getTransferData(DataFlavor.stringFlavor);
} catch (Exception e) {
return false;
}
String dropValue = "\"" + data + "\" dropped ";
if (dl.isInsert()) {
if (dl.getIndex() == 0) {
displayDropLocation(dropValue + "at beginning of list");
} else if (dl.getIndex() >= list.getModel().getSize()) {
displayDropLocation(dropValue + "at end of list");
} else {
String value1 = (String) list.getModel().getElementAt(dl.getIndex() - 1);
String value2 = (String) list.getModel().getElementAt(dl.getIndex());
displayDropLocation(dropValue + "between \"" + value1 + "\" and \"" + value2 + "\"");
}
} else {
displayDropLocation(dropValue + "on top of " + "\"" + value + "\"");
}
return false;
}
public int getSourceActions(JComponent c) {
return COPY;
}
protected Transferable createTransferable(JComponent c) {
JList list = (JList) c;
Object[] values = list.getSelectedValues();
StringBuffer buff = new StringBuffer();
for (int i = 0; i < values.length; i++) {
Object val = values[i];
buff.append(val == null ? "" : val.toString());
if (i != values.length - 1) {
buff.append("\n");
}
}
return new StringSelection(buff.toString());
}
});
第二部分是JavaFX代码:
pane.setOnDragDetected(event -> {
Dragboard db = pane.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString("hallo");
db.setContent(content);
event.consume();
});
pane.setOnDragOver(event -> {
final Dragboard dragboard;
dragboard = event.getDragboard();
if (dragboard.hasString()){
event.acceptTransferModes(TransferMode.ANY);
System.out.println(dragboard.getString());
}
event.consume();
});
pane.setOnDragDropped(event -> {
/* data dropped */
/* if there is a string data on dragboard, read it and use it */
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString()) {
String data = db.getString();
label.setText(data);
SwingUtilities.invokeLater(() -> showStatus(data, "JavaFX"));
success = true;
}
event.setDropCompleted(success);
event.consume();
});
将字符串从JavaFx组件拖动到Swing效果很好,但是swing无法接受从Swing拖动字符串。当我使用dragboard.getString()在方法setOnDragOver()中打印字符串时,它为null。
如何解决此问题?非常感谢。