好的,这个问题超出了我的范围。我正在尝试在 swing 中实现一个 GUI 小部件,它允许将文件拖放到 JTable 上,并允许拖动 JTable 的行以进行重新排序。想想 VLC 的播放列表或 iTunes 中的播放列表。
我从操作系统(资源管理器、查找器等)中删除文件工作得很好,但是一旦文件进入,我就无法重新排列表的行。问题是当我添加一个自定义的 TransferHandler 到 table,从table 中拖动会立即被杀死。这是一些示例代码:
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 out 圆形光标说我不能放在那里)。但是一旦为表设置了 TransferHandler,我就不能拖动任何行。问题必须出在 TransferHandler 中,但我已经彻底解决并调试了它,并确定一旦桌子上有 TransferHandler 就永远不会开始拖动。我究竟做错了什么?