Хорошо, эта проблема из моей лиги. Я пытаюсь реализовать виджет GUI в swing, который позволяет удалять файлы на JTable и позволяет перетаскивать строки JTable для повторной сортировки. Подумайте о плейлистах VLC или о том, что в iTunes.
Я удалил файлы из ОС (Explorer, 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 out circle, говорящий, что я не могу туда попасть). Но как только TransferHandler установлен для таблицы, я не могу перетаскивать любые строки. Проблема должна быть в TransferHandler, но я тщательно устранил и отладил ее, и решил, что перетаскивание никогда не запускается, если на столе есть TransferHandler. Что я делаю неправильно?