我编写了一个允许行拖放的TableView代码。作为独立的JavaFX应用程序非常有用。但是,它在嵌入式JFXPanel中无法在Swing应用程序中工作。我想将它与我的Swing应用程序集成,因此我无法将其作为独立应用程序使用。
错误发生在JavaFX代码本身,这并没有给我很多东西。我不确定我是否可以更改我的代码来解决问题。
我已经删除了剩下的大部分代码,并且第一部分失败了。 onDragDetected代码首先失败。
这是错误:
java.lang.AssertionError
at javafx.embed.swing.SwingDnD.startDrag(SwingDnD.java:261)
at javafx.embed.swing.SwingDnD.access$1000(SwingDnD.java:73)
at javafx.embed.swing.SwingDnD$4$1.run(SwingDnD.java:249)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
…
这是我在自定义TableView类中创建处理程序的代码
private EventHandler<MouseEvent> createDragDetectedHandler(
final TableCell<ReportSelectedItem, String> cell) {
return new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
try {
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString(String.valueOf(cell.getIndex()));
WritableImage snapshot = cell.getTableRow().snapshot(new SnapshotParameters(), null);
db.setDragView(snapshot);
db.setContent(content);
} catch (AssertionError ex) {
ex.printStackTrace();
}
}
};
}
此行抛出异常:Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
我在try-catch块中添加了它以缩小范围,并找到该行。堆栈跟踪是巨大的,所以我没有发布所有这些。
这里是班级宣言
public class DragAndDropTableCell<S extends Object, T extends Object> extends TableCell {
private ReportSelectedItem blankRSI = new ReportSelectedItem();
public DragAndDropTableCell() {
super();
setOnDragDetected(createDragDetectedHandler(this));
}
所以,我注意到它在我的嵌入式实例中调用了SwingDnD,但是GlassScene独立存在。因此,它使用不同的代码来实现拖放功能。
这是我应该向Oracle报告的错误吗?
答案 0 :(得分:0)
我通过JIRA向JavaFX开发团队提交了一个错误。看起来他们接受了一个bug。
我找到的解决方法是改变:
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
到
Dragboard db = cell.startDragAndDrop(TransferMode.COPY_MOVE);
我不确定内部功能有多大变化。但基本的拖放似乎工作正常。