std*_*ave 11 java swing drag-and-drop jtable
好的,这个问题超出了我的联盟.我正在尝试在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);
}
}
Run Code Online (Sandbox Code Playgroud)
按原样运行此代码,您将看到无法启动对表的拖动.如果您在表上注释掉对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
ArrayList<File> files = new ArrayList<File>();
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);
}
});
Run Code Online (Sandbox Code Playgroud)
您似乎没有正确使用 TransferHandler。尝试阅读此处的教程。
\n\n请参阅此处的TransferHandler 文档。空构造函数看起来并不适合在 TransferHandler 的子类之外使用。
\n\n并且您不会实现 Swing 组件上提供的标准 TransferHandler 中提供的任何功能。请参阅此处DnD 教程的摘录(我的粗体):
\n\n\n\n注意:如果将自定义 TransferHandler 安装到 Swing 组件上,则默认支持将被替换。例如,如果您将 JTextField\ 的 TransferHandler 替换为仅处理颜色的 TransferHandler,则会禁用其支持文本导入和导出的功能。\n 如果您必须替换默认的 TransferHandler \xe2\x80\x94,例如,处理文本 \xe2\x80\x94 您将需要重新实现文本导入和导出功能。这不需要像 Swing 提供的 \xe2\x80\x94 那样广泛,它可以像支持 StringFlavor 数据风格一样简单,具体取决于应用程序的需求。
\n
| 归档时间: |
|
| 查看次数: |
17189 次 |
| 最近记录: |