Проблема перетаскивания Java (переносимая) в Visual Studio 10 - PullRequest
1 голос
/ 08 февраля 2012

У меня есть программа, которая содержит JTable, куда я могу перетаскивать данные ячейки во внешнюю IDE

Мой переносимый класс поддерживает два типа данных

  1. DataFlavor.stringFlavor
  2. 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

...