У меня есть программа, которая содержит JTable, куда я могу перетаскивать данные ячейки во внешнюю IDE
Мой переносимый класс поддерживает два типа данных
DataFlavor.stringFlavor
CUST_FLAVOR
(пользовательский вариант данных, используемый в приложении)
Когда я пытаюсь перетащить данные ячейки в Eclipse / Wordpad, все работает нормально. JVM позвонит getTransferData()
для stringFlavor
.
Но когда я пытаюсь перетащить в интерфейс Visual Studio 10, JVM вызовет getTransferData()
для stringFlavor
и CUST_FLAVOR
. Я не знаю, почему это происходит только с интерфейсом Visual Studio 10. Я пытался с Visual Studio 2005, и нет никаких проблем.
Ниже мой код
Если я пытаюсь скопировать в wordpad, он печатает (на system.out)
getTransferData flavour = Unicode String
но в Visual Studio 10 он печатает (на system.out)
getTransferData flavour = Unicode String
вкус getTransferData = CUST_FLAVOR
В методе getTransferData()
, если это аромат CUST_FLAVOR
, он должен вернуть объект, который не является Serializable
, и, следовательно, он выдаст NotSerializableException
.
Теперь, как мне запретить JVM не вызывать getTransferData()
для CUST_FLAVOR
, когда я пытаюсь перетащить в Visual Studio?
public class DragDropTest extends JPanel{
private JTable table;
public static final DataFlavor CUST_FLAVOR = new DataFlavor(File.class, "CUST_FLAVOR");
DragDropTest(){
table = new JTable(5, 1);
table.getModel().setValueAt("Data 1", 0, 0);
table.getModel().setValueAt("Data 2", 1, 0);
table.setTransferHandler(new TransferHandler(){
public int getSourceActions(JComponent c){
return COPY;
}
protected Transferable createTransferable(JComponent component){
TableModel model = ((JTable)component).getModel();
Transferable transferable=new GenericTransferable(
model.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
return transferable;
}
class GenericTransferable implements Transferable{
private String str;
public GenericTransferable(Object str){
this.str = str.toString();}
public DataFlavor[] getTransferDataFlavors(){
return new DataFlavor[]{DataFlavor.stringFlavor, CUST_FLAVOR};}
public boolean isDataFlavorSupported(DataFlavor flavor){
return flavor.equals(DataFlavor.stringFlavor) || flavor.equals(CUST_FLAVOR);}
public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException{
System.out.println("getTransferData flavor = " + flavor.getHumanPresentableName());
if (flavor.equals(CUST_FLAVOR)) {
return new Object();
}
else if (flavor.equals(DataFlavor.stringFlavor)) {
return str;
}
throw new UnsupportedFlavorException(flavor);
}
}
});
setLayout(new GridLayout(1,0));
table.setDragEnabled(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
add(new JScrollPane(table));
}
public static void main(String[] args) {
JFrame frame = new JFrame("DragAndDropTest");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new DragDropTest(), BorderLayout.CENTER);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
Спасибо
-rooble