代码之家  ›  专栏  ›  技术社区  ›  Lukas Körfer

自定义对象从Fx拖放到Swing

  •  1
  • Lukas Körfer  · 技术社区  · 7 年前

    我正在开发一个JavaFX应用程序,它应该通过拖放与现有的Swing应用程序进行交互。通过拖放来进行数据交换实际上是有效的,但是我们希望重做该功能的一部分,以便实际上将自定义Java对象替换为序列化为JSON的对象的简单字符串。问题是,如果使用自定义的mime类型而不是例如,swing用户界面不会接收拖动的数据。 text/plain . 下面是拖动应用程序(javafx)和放置应用程序(swing)的最小示例。

    FXTRAW

    public class FxDrag extends Application {
    
        private static final DataFormat format = new DataFormat("application/x-my-mime-type");
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            BorderPane root = new BorderPane();
            root.setOnDragDetected(event -> {
                Dragboard dragboard = root.startDragAndDrop(TransferMode.COPY);
                ClipboardContent content = new ClipboardContent();
                content.putString("Test");
                // content.put(format, "Test");
                dragboard.setContent(content);
                event.consume();
            });
            stage.setScene(new Scene(root, 300, 300));
            stage.setTitle("Drag");
            stage.show();
        }
    }
    

    旋转下降

    public class SwingDrop {
    
        public static void main(String[] args) {
            new SwingDrop().run();
        }
    
        private void run() {
            JPanel panel = new JPanel();
            panel.setTransferHandler(new TransferHandler() {
    
                @Override
                public boolean canImport(TransferSupport support) {
                    return true;
                }
    
                @Override
                public boolean importData(TransferSupport support) {
                    Stream.of(support.getDataFlavors()).forEach(flavor -> {
                        System.out.println(flavor.getMimeType());
                    });
                    return super.importData(support);
                }
    
            });
            JFrame frame = new JFrame();
            frame.setTitle("Drop");
            frame.add(panel);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
    }
    

    当放置 String 通过 putString content 在JavaFX应用程序中,Swing应用程序接收拖动并提供以下风格:

    application/x-java-serialized-object; class=java.lang.String
    text/plain; class=java.io.Reader; charset=Unicode
    text/plain; class=java.lang.String; charset=Unicode
    text/plain; class=java.nio.CharBuffer; charset=Unicode
    text/plain; class="[C"; charset=Unicode
    text/plain; class=java.io.InputStream; charset=unicode
    text/plain; class=java.nio.ByteBuffer; charset=UTF-16
    text/plain; class="[B"; charset=UTF-16
    text/plain; class=java.io.InputStream; charset=UTF-8
    text/plain; class=java.nio.ByteBuffer; charset=UTF-8
    text/plain; class="[B"; charset=UTF-8
    text/plain; class=java.io.InputStream; charset=UTF-16BE
    text/plain; class=java.nio.ByteBuffer; charset=UTF-16BE
    text/plain; class="[B"; charset=UTF-16BE
    text/plain; class=java.io.InputStream; charset=UTF-16LE
    text/plain; class=java.nio.ByteBuffer; charset=UTF-16LE
    text/plain; class="[B"; charset=UTF-16LE
    text/plain; class=java.io.InputStream; charset=ISO-8859-1
    text/plain; class=java.nio.ByteBuffer; charset=ISO-8859-1
    text/plain; class="[B"; charset=ISO-8859-1
    text/plain; class=java.io.InputStream; charset=windows-1252
    text/plain; class=java.io.InputStream
    text/plain; class=java.nio.ByteBuffer; charset=windows-1252
    text/plain; class="[B"; charset=windows-1252
    text/plain; class=java.io.InputStream; charset=US-ASCII
    text/plain; class=java.nio.ByteBuffer; charset=US-ASCII
    text/plain; class="[B"; charset=US-ASCII
    

    我甚至可以从不同的应用程序(如浏览器等)中删除不同的数据,Swing应用程序提供了相应的数据风格(文本、图像等)。

    但是,如果我使用自定义格式,则不会列出任何口味。Swing是否过滤通过拖放应用程序传输的数据风格?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Slaw    7 年前


    GitLab repository

    model com.example.dnd.model.Doctor Serializable firstName lastName number Doctor TableView JTable

    GIF of example in action


    DataFormat

    application/x-my-mime-type; class=com.example.dnd.model.Doctor
    

    class= JAVA_DATAFLAVOR:

    JAVA_DATAFLAVOR:application/x-my-mime-type; class=com.example.dnd.model.Doctor
    

    onDragDetected

    DataFormat format = new DataForamt(
        "JAVA_DATAFLAVOR:application/x-my-mime-type; class=com.example.dnd.model.Doctor",
        "application/x-my-mime-type; class=com.example.dnd.model.Doctor"
    );
    

    JAVA_DATAFLAVOR static final

    onDragXXX


    Oracle Tutorials

    import com.example.dnd.model.Doctor;
    import java.awt.datatransfer.Transferable;
    import java.util.ArrayList;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.TransferHandler;
    
    public class DoctorTransferHandler extends TransferHandler {
    
      @Override
      public boolean canImport(TransferSupport support) {
        return support.isDrop() && support.isDataFlavorSupported(DoctorTransferable.DOCTOR_FLAVOR);
      }
    
      @Override
      public boolean importData(TransferSupport support) {
        if (!canImport(support)) {
          return false;
        }
        JTable table = (JTable) support.getComponent();
        DoctorTableModel model = (DoctorTableModel) table.getModel();
        try {
          Transferable transferable = support.getTransferable();
          ArrayList<Doctor> list =
              (ArrayList<Doctor>) transferable.getTransferData(DoctorTransferable.DOCTOR_FLAVOR);
          model.addAll(list);
          return true;
        } catch (Exception ex) {
          ex.printStackTrace();
          return false;
        }
      }
    
      @Override
      public int getSourceActions(JComponent c) {
        return COPY_OR_MOVE;
      }
    
      @Override
      protected Transferable createTransferable(JComponent c) {
        JTable table = (JTable) c;
        DoctorTableModel model = (DoctorTableModel) table.getModel();
        return new DoctorTransferable(model.getAll(table.getSelectedRows()));
      }
    
      @Override
      protected void exportDone(JComponent source, Transferable data, int action) {
        if (action == MOVE) {
          JTable table = (JTable) source;
          DoctorTableModel model = (DoctorTableModel) table.getModel();
          model.removeAll(model.getAll(table.getSelectedRows()));
        }
      }
    

    import com.example.dnd.model.Doctor;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class DoctorTransferable implements Transferable {
    
      public static final DataFlavor DOCTOR_FLAVOR;
    
      static {
        try {
          DOCTOR_FLAVOR = new DataFlavor("application/x-my-mime-type; class=java.util.ArrayList");
        } catch (ClassNotFoundException ex) {
          throw new RuntimeException(ex);
        }
      }
    
      private final ArrayList<Doctor> doctors;
    
      public DoctorTransferable(Collection<? extends Doctor> doctors) {
        this.doctors = new ArrayList<>(doctors);
      }
    
      @Override
      public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[]{DOCTOR_FLAVOR};
      }
    
      @Override
      public boolean isDataFlavorSupported(DataFlavor flavor) {
        return DOCTOR_FLAVOR.equals(flavor);
      }
    
      @Override
      public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        if (DOCTOR_FLAVOR.equals(flavor)) {
          return doctors;
        }
        throw new UnsupportedFlavorException(flavor);
      }
    
    }
    

    TransferHandler#createTranserfable

    canImport importData

    exportDone


    TableCell

        2
  •  0
  •   Lukas Körfer    7 年前


    public class FxDrag extends Application {
    
        public static final DataFormat FORMAT = new DataFormat(
            "JAVA_DATAFLAVOR:application/x-my-mime-type; class=java.lang.String",
            "application/x-my-mime-type; class=java.lang.String");
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            BorderPane root = new BorderPane();
            root.setOnDragDetected(event -> {
                Dragboard dragboard = root.startDragAndDrop(TransferMode.COPY);
                ClipboardContent content = new ClipboardContent();
                content.put(FORMAT, "Test123");
                dragboard.setContent(content);
                event.consume();
            });
    
            stage.setScene(new Scene(root, 300, 300));
            stage.setTitle("Drag");
            stage.show();
        }
    
    }
    

    public class SwingDrop {
    
        public static final DataFlavor FLAVOR;
    
        static {
            try {
                FLAVOR = new DataFlavor("application/x-my-mime-type; class=java.lang.String");
            } catch (ClassNotFoundException ex) {
                throw new RuntimeException(ex);
            }
        }
    
        public static void main(String[] args) {
            new SwingDrop().run();
        }
    
        private void run() {
            JPanel panel = new JPanel();
            panel.setTransferHandler(new TransferHandler() {
    
                @Override
                public boolean canImport(TransferSupport support) {
                    return support.isDataFlavorSupported(FLAVOR);
                }
    
                @Override
                public boolean importData(TransferSupport support) {
                    if (!canImport(support)) return false;
                    try {
                        String data = (String) support.getTransferable().getTransferData(FLAVOR);
                        System.out.println(data);
                        return true;
                    } catch (UnsupportedFlavorException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return false;
                }
    
            });
            JFrame frame = new JFrame("Drop");
            frame.getContentPane().add(panel);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
    
    }
    

    String

    推荐文章