JavaFXSwing节点D&;D自1.8.0(U 40)起失效
我正在我的一个JavaFX应用程序中使用Swing JTextArea。 该应用程序支持D&D,这在Java 1.8.020中一直运行良好。 使用Java 1.8.0(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
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();
}
});