Java 仅针对Swing中的特定目标启用下降
我试图用两个Java 仅针对Swing中的特定目标启用下降,java,swing,awt,drag-and-drop,Java,Swing,Awt,Drag And Drop,我试图用两个JList实例在java中实现拖放。 基本流程运行良好。但是,当我从一个列表中拖动一个字符串时,我只想将拖放目标限制在第二个列表中。 我注意到,当我将一个字符串从一个列表拖到桌面时,它会创建一个包含该字符串的文件 有没有办法避免这种情况 public class SampleDnD extends JFrame{ public static void main(String[] args) { new SampleDnD(); } /**
JList
实例在java中实现拖放。
基本流程运行良好。但是,当我从一个列表中拖动一个字符串时,我只想将拖放目标限制在第二个列表中。
我注意到,当我将一个字符串从一个列表拖到桌面时,它会创建一个包含该字符串的文件
有没有办法避免这种情况
public class SampleDnD extends JFrame{
public static void main(String[] args) {
new SampleDnD();
}
/**
* new form of frame sample contain 2 JLists with drag enabled.
*/
public SampleDnD(){
JList l1 = new JList();
JList l2 = new JList();
JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
JScrollPane jScrollPane2 = new javax.swing.JScrollPane();
DefaultListModel listModel1 = new DefaultListModel();
DefaultListModel listModel2 = new DefaultListModel();
String[] list1 = new String[]{"1","3","5","7","9"};
String [] list2 = new String[]{"0","2","4","6","8"};
for(int index=0;index<list1.length;index++){
listModel1.add(index, list1[index]);
listModel2.add(index, list2[index]);
}
l1.setModel(listModel1);
l2.setModel(listModel2);
l1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
l2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
l1.setDropMode(DropMode.INSERT);
l1.setDragEnabled(true);
l2.setDragEnabled(true);
l1.setTransferHandler(new ListTransferHandler());
l2.setDropMode(DropMode.INSERT);
l2.setTransferHandler(new ListTransferHandler());
jScrollPane1.setViewportView(l1);
jScrollPane2.setViewportView(l2);
Container cp = getContentPane();
cp.setLayout(new BoxLayout(cp,BoxLayout.Y_AXIS));
setPreferredSize(new Dimension(800,500));
getContentPane().add(jScrollPane1);
getContentPane().add(jScrollPane2);
setVisible(true);
pack();
}
public class ListTransferHandler extends TransferHandler {
/**
* We only support importing strings.
*/
public boolean canImport(TransferHandler.TransferSupport info) {
// Check for String flavor
if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
return true;
}
/**
* Bundle up the selected items in a single list for export.
*
*/
protected Transferable createTransferable(JComponent c) {
JList list = (JList)c;
String value = (String)list.getSelectedValue();
return new StringSelection(value);
}
/**
* We support only move actions.
*/
public int getSourceActions(JComponent c) {
return TransferHandler.MOVE;
}
/**
* Perform the actual import. This demo only supports drag and drop.
*/
public boolean importData(TransferHandler.TransferSupport info) {
if (!info.isDrop()) {
return false;
}
JList list = (JList)info.getComponent();
DefaultListModel listModel = (DefaultListModel)list.getModel();
JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
int index = dl.getIndex();
boolean insert = dl.isInsert();
// Get the string that is being dropped.
Transferable t = info.getTransferable();
String data;
try {
data = (String)t.getTransferData(DataFlavor.stringFlavor);
}
catch (Exception e) { return false; }
if (insert) {
listModel.add(index++, data);
} else {
// If the items go beyond the end of the current
// list, add them in.
if (index < listModel.getSize()) {
listModel.set(index++, data);
} else {
listModel.add(index++, data);
}
}
return true;
}
/**
* Remove the items moved from the list.
*/
protected void exportDone(JComponent c, Transferable data, int action) {
JList source = (JList)c;
DefaultListModel listModel = (DefaultListModel)source.getModel();
if(action == TransferHandler.MOVE)
{
listModel.remove(source.getSelectedIndex());
}
}
}
}
public类SampleDnD扩展JFrame{
公共静态void main(字符串[]args){
新样本d();
}
/**
*新形式的框架示例包含2个已启用拖动的JLists。
*/
公共样本{
JList l1=新JList();
JList l2=新的JList();
JScrollPane-jScrollPane1=newjavax.swing.JScrollPane();
JScrollPane-jScrollPane2=newjavax.swing.JScrollPane();
DefaultListModel listModel1=新的DefaultListModel();
DefaultListModel listModel2=新的DefaultListModel();
字符串[]列表1=新字符串[]{“1”、“3”、“5”、“7”、“9”};
字符串[]列表2=新字符串[]{“0”、“2”、“4”、“6”、“8”};
对于(int index=0;index有点晚,但可能对其他人有帮助:
您需要创建自己的DatFlavor,它只会被您自己的应用程序接受
DataFlavor myObjectDataFlavor = new DataFlavor(MyObject.class, "java/MyObject");
传递这一个,而不是默认的DataFlavor.javaFileListFlavor
或DataFlavor.stringFlavor
。您的类MyObject
是一个Pojo,只包含字符串或整数类型的类变量或您需要的任何类型的类变量。使应用程序全屏且不可调整大小?要更快获得更好的帮助,请发布一个n选项。我不明白你的意思,SSCCE是一个代码示例。如果我有解决方案,我就不能给出一个我寻找解决方案的示例,所以我可能不会首先问。所以我会再次问:是否有任何代码可以仅为Swing中的特定目标启用drop?”…SSCCE是一个代码示例。”是的。给我看一个带有两个列表的示例代码,启用D'n'D可以显示“拖到桌面”问题&我更可能在IDE中加载它,编译它并尝试解决方案。我的意思是发布一个简短的代码示例。Andrew是对的。你写的代码已经为你工作了,但有些问题你想解决。你也许我们可以隔离这个特定的类,在它周围创建虚拟类(例如,为了提供数据),将它包装在一个简单的单帧主类中,然后将它发布到某个地方。然后我们就有了一个“玩”的起点。或者认为我们太懒了,以至于不能编写这样的代码(但自己编写可能会偏离您自己的目标)或者说,在通往我们的道路上走一半会让你更接近解决方案。。。