JavaFXSwing节点D&;D自1.8.0(U 40)起失效

JavaFXSwing节点D&;D自1.8.0(U 40)起失效,swing,drag-and-drop,javafx-8,Swing,Drag And Drop,Javafx 8,我正在我的一个JavaFX应用程序中使用Swing JTextArea。 该应用程序支持D&D,这在Java 1.8.020中一直运行良好。 使用Java 1.8.0(40)时,我遇到一个错误: Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: failed to parse:Shell IDList Array at java.awt.datatransfer.DataFlavor.&l

我正在我的一个JavaFX应用程序中使用Swing JTextArea。 该应用程序支持D&D,这在Java 1.8.020中一直运行良好。 使用Java 1.8.0(40)时,我遇到一个错误:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: failed to parse:Shell IDList Array
    at java.awt.datatransfer.DataFlavor.<init>(DataFlavor.java:503)
    at javafx.embed.swing.DataFlavorUtils.getDataFlavors(DataFlavorUtils.java:64)
    at javafx.embed.swing.CachingTransferable.getTransferDataFlavors(CachingTransferable.java:62)
    at javafx.embed.swing.FXDnD$FXDropTargetContextPeer.getTransferDataFlavors(FXDnD.java:450)
    at java.awt.dnd.DropTargetContext.getCurrentDataFlavors(DropTargetContext.java:223)
    at java.awt.dnd.DropTargetDragEvent.getCurrentDataFlavors(DropTargetDragEvent.java:139)
    at javax.swing.TransferHandler$TransferSupport.getDataFlavors(TransferHandler.java:532)
    at javax.swing.TransferHandler.canImport(TransferHandler.java:926)
    at javax.swing.TransferHandler$DropHandler.handleDrag(TransferHandler.java:1467)
    at javax.swing.TransferHandler$DropHandler.dragEnter(TransferHandler.java:1486)
    at java.awt.dnd.DropTarget.dragEnter(DropTarget.java:358)
    at javax.swing.TransferHandler$SwingDropTarget.dragEnter(TransferHandler.java:1238)
    at javafx.embed.swing.FXDnD$FXDropTargetContextPeer.lambda$postDropTargetEvent$11(FXDnD.java:504)
    at javafx.embed.swing.FXDnD$FXDropTargetContextPeer$$Lambda$135/2110853554.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:702)
    at java.awt.EventQueue$3.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中的异常:未能分析:Shell IDList数组 位于java.awt.datatransfer.DataFlavor.(DataFlavor.java:503) 位于javafx.embed.swing.DataFlavorUtils.getDataFlavors(DataFlavorUtils.java:64) 位于javafx.embed.swing.CachingTransferable.getTransferDataFlavors(CachingTransferable.java:62) 位于javafx.embed.swing.FXDnD$FXDropTargetContextPeer.getTransferDataFlavors(FXDnD.java:450) 位于java.awt.dnd.DropTargetContext.getCurrentDataFlavors(DropTargetContext.java:223) 位于java.awt.dnd.DropTargetDragEvent.getCurrentDataFlavors(DropTargetDragEvent.java:139) 位于javax.swing.TransferHandler$TransferSupport.getDataFlavors(TransferHandler.java:532) 位于javax.swing.TransferHandler.canImport(TransferHandler.java:926) 位于javax.swing.TransferHandler$DropHandler.handleDrag(TransferHandler.java:1467) 位于javax.swing.TransferHandler$DropHandler.dragEnter(TransferHandler.java:1486) 位于java.awt.dnd.DropTarget.dragEnter(DropTarget.java:358) 位于javax.swing.TransferHandler$SwingDropTarget.dragEnter(TransferHandler.java:1238) 位于javafx.embed.swing.FXDnD$FXDropTargetContextPeer.lambda$postDropTargetEvent$11(FXDnD.java:504) 位于javafx.embed.swing.FXDnD$fxropTargetContextPeer$$Lambda$135/2110853554.run(未知源) 在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)中 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749) 在java.awt.EventQueue.access$500(EventQueue.java:97) 在java.awt.EventQueue$3.run(EventQueue.java:702) 在java.awt.EventQueue$3.run(EventQueue.java:696) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:719) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)中 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 一个简短的运行示例来说明问题:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingNode;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class TestDDWithSwing extends Application  {

    private boolean stop=false; 
    private Thread swingNodeRefresher=null;

    public static void main(String[] args) {
        launch(args);
    }

    public void start(Stage stage) {
        Scene scene = new Scene(new StackPane());
        SwingNode swingNode= new SwingNode();
        final JTextArea ta=new JTextArea("drop a file..."); 
        final JPanel panel = new JPanel(new BorderLayout());
        panel.add(ta,BorderLayout.CENTER);
        final JScrollPane jsp = new JScrollPane(ta);
        ta.setMinimumSize(new Dimension(200,200));
        swingNode.setContent(jsp);

        swingNode.setOnDragOver(new EventHandler<DragEvent>() {
            @Override
            public void handle(DragEvent event) {
                Dragboard db = event.getDragboard();
                if (db.hasFiles()) {
                    event.acceptTransferModes(TransferMode.COPY);
                } 
                event.consume();
            }
        });
        swingNode.setOnDragDropped(new EventHandler <DragEvent>()  {
            @Override
            public void handle(DragEvent event) {
                Dragboard dragboard = event.getDragboard();
                event.consume();
                if(dragboard.hasFiles()){
                    try{
                        File file= dragboard.getFiles().get(0);
                        System.out.println(Platform.isFxApplicationThread());
                        if(file.isFile()) {
                                ta.setText(readFile(file.getCanonicalFile())); 
                        }
                    } catch (Exception e) {e.printStackTrace();}
                }
                dragboard.clear();
            }
        });

        ((StackPane) scene.getRoot()).getChildren().add(swingNode);
        stage.setOnCloseRequest(
                new EventHandler<WindowEvent>() {
                    @Override
                    public void handle(WindowEvent event) {
                        stop=true;
                        swingNodeRefresher.interrupt();
                        try {Thread.sleep(300);} catch (InterruptedException e) {   }
                        System.exit(0);
                    }
                });
        stage.setWidth(200);
        stage.setHeight(200);
        stage.setScene(scene);
        stage.show();

        Task<Integer> task = new Task<Integer>() {
            @Override protected Integer call() throws Exception {
                while (!stop){
                    ta.repaint();
                    try {Thread.sleep(300);} catch (InterruptedException e) {   }
                    }

                return 0;
            }
        };
        swingNodeRefresher=new Thread(task);
        swingNodeRefresher.start();
    }

    private static String readFile(File file) throws IOException{
        System.out.println("importing: " + file.getCanonicalPath() );
        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        StringBuilder sb = new StringBuilder();
        String x=in.readLine();
        sb.append(x);
        while(x != null){
            x=in.readLine();
            if(x != null){
                sb.append("\n");
                sb.append(x);
            } 
        }
        in.close();
        return sb.toString();
    }

}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入javafx.application.application;
导入javafx.concurrent.Task;
导入javafx.embed.swing.SwingNode;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.DragEvent;
导入javafx.scene.input.Dragboard;
导入javafx.scene.input.TransferMode;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
导入javafx.stage.WindowEvent;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
公共类TestDDWithSwing扩展了应用程序{
私有布尔停止=false;
私有线程SwingNodeRefresh=null;
公共静态void main(字符串[]args){
发射(args);
}
公众假期开始(阶段){
场景=新场景(新StackPane());
SwingNode SwingNode=新SwingNode();
最终JTextArea ta=新JTextArea(“删除文件…”);
最终JPanel面板=新JPanel(新的BorderLayout());
面板。添加(ta,边框布局。中心);
最终JScrollPane jsp=新JScrollPane(ta);
ta.设置最小尺寸(新尺寸(200200));
setContent(jsp);
setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
Dragboard db=event.getDragboard();
if(db.hasFiles()){
event.acceptTransferModes(TransferMode.COPY);
} 
event.consume();
}
});
swingNode.setOnDragDrop(新的EventHandler(){
@凌驾
公共无效句柄(DrageEvent事件){
Dragboard Dragboard=event.getDragboard();
event.consume();
if(dragboard.hasFiles()){
试一试{
File File=dragboard.getFiles().get(0);
System.out.println(Platform.isFxApplicationThread());
if(file.isFile()){
setText(readFile(file.getCanonicalFile());
}
}catch(异常e){e.printStackTrace();}
}
拖板。清除();
}
});
((StackPane)scene.getRoot()).getChildren().add(swingNode);
stage.setOnCloseRequest(
新的EventHandler(){
@凌驾
公共无效句柄(WindowEvent事件){
停止=真;
swingnoderesfreasher.interrupt();
试试{Thread.sleep(300);}catch(InterruptedException e){}
系统出口(0);
}
});
舞台布景宽度(200);
舞台设置高度(200);
舞台场景;
stage.show();
任务=新任务(){
@重写受保护的整数调用()引发异常{
当(!停止){
ta.repaint();
试试{Thread.sleep(300);}catch(InterruptedException e){}
}
返回0;
}
};
swingNodeRefresher=新线程(任务);
斯文格诺德
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.stage.Stage;

import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class SwingTest_TextArea extends Application
{
    public static void main(String[] args){
        Application.launch(SwingTest_TextArea.class);
    }

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        SwingNode swingNode1 = new SwingNode();
        JPanel jp1 = new JPanel(new BorderLayout());
        JTextArea jta = new JTextArea();
        jp1.add(jta, BorderLayout.CENTER);
        SwingUtilities.invokeLater(() -> {swingNode1.setContent(jp1);});


        JPanel jp2 = new JPanel(new BorderLayout());
        SwingNode swingNode2 = new SwingNode();
        SwingUtilities.invokeLater(() -> {swingNode2.setContent(jp2);});
        swingNode2.setOnDragEntered(new EventHandler<DragEvent>() {
                @Override
                public void handle(DragEvent event) {
                    Dragboard db = event.getDragboard();
                    if (db.hasFiles()) {
                        event.acceptTransferModes(TransferMode.COPY);
                        String filePath = null;
                        for (File file:db.getFiles()) {
                            filePath = file.getAbsolutePath();
                            System.out.println(filePath);
                        }
                    } else {

                    }
                    event.consume();
                }
            });


        TabPane tp= new TabPane();
        Tab tab1 = new Tab("JTextArea");
        Tab tab2 = new Tab("JPanel");
        tp.getTabs().addAll(tab1,tab2);
        tab1.setContent(swingNode1);
        tab2.setContent(swingNode2);

        primaryStage.setScene(new Scene(tp));
        primaryStage.setOnCloseRequest((x)->{System.exit(0);});
        primaryStage.setWidth(300);
        primaryStage.setHeight(200);
        primaryStage.show();
    }
}
swingNode.addEventFilter(EventType.ROOT, event -> {
    final String type = event.getEventType().getName();
    if (type.contains("DRAG") || type.contains("drag")) {
        // Handle the drag event here if you want)
        ...

        // Avoid drag event reaching the underlying swing components
        event.consume();
    }
});