好的,这个问题超出了我的联盟.我正在尝试在swing中实现一个GUI小部件,允许将文件放到JTable上,并允许拖动JTable的行进行重新排序.想想VLC的播放列表或iTunes中的播放列表.
我从操作系统(资源管理器,Finder等)中删除文件工作得很好,但是一旦文件进入,我就有了重新安排表行的不可能的时间.问题是当我添加时一个自定义的TransferHandler到表,从表中拖动被立即杀死.这是一些示例代码:
import javax.swing.*; public class TableTest { public static void main (String [] argv) { // setup table data String [] columns = new String [] {"Foo", "Bar", "Baz", "Quux"}; String [][] data = new String [][] {{"A", "B", "C", "D"}, {"1", "2", "3", "4"}, {"i", "ii", "iii", "iv"}}; // create table JTable table = new JTable(data, columns); // set up drag and drop table.setDragEnabled(true); table.setDropMode(DropMode.INSERT_ROWS); table.setFillsViewportHeight(true); TransferHandler dnd = new TransferHandler() { // here be code to handle drops, and one would // presume drag exporting, too }; table.setTransferHandler(dnd); JScrollPane scroll = new JScrollPane(table); // create and show window JFrame window = new JFrame(); window.getContentPane().add(scroll); window.pack(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setVisible(true); } }
按原样运行此代码,您将看到无法启动对表的拖动.如果您在表上注释掉对setTransferHandler()的调用,则拖动工作(即,当我开始拖动表行时,我得到X'd出圆圈光标说我不能放弃那里).但是只要为表设置了TransferHandler,我就无法拖动任何行.问题必须在TransferHandler中,但是我彻底麻烦并调试它,并确定一旦桌面上有TransferHandler就永远不会启动拖动.我究竟做错了什么?
我有同样的问题,它与您的TransferHandler的自定义实现无关.当您替换TransferHandler时,您还需要保留默认的DragSource并告诉它识别拖动手势.您可能还需要实现自己的Transferable,因为您需要将它传递给DragGestureEvent.startDrag()方法.
table.setTransferHandler(new MyTransferHandler()); table.setDragEnabled(true); DragSource source = DragSource.getDefaultDragSource(); source.createDefaultDragGestureRecognizer(table, DnDConstants.ACTION_COPY, new DragGestureListener() { @Override public void dragGestureRecognized(DragGestureEvent dge) { //grab the selected files from the table model ArrayListfiles = new ArrayList (); for (int row : table.getSelectedRows()) { files.add((File) dm.getValueAt(row, 1)); } //FileTransferable is a custom Transferable implementation Transferable transferable = new FileTransferable(files); //and this is the magic right here dge.startDrag(null,transferable); } });