尝试在Swing中使用嵌入式JavaFX实现拖放时出现断言错误

时间:2014-08-07 18:38:58

标签: java javafx javafx-8

我编写了一个允许行拖放的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报告的错误吗?

1 个答案:

答案 0 :(得分:0)

我通过JIRA向JavaFX开发团队提交了一个错误。看起来他们接受了一个bug。

我找到的解决方法是改变:

Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);

Dragboard db = cell.startDragAndDrop(TransferMode.COPY_MOVE);

我不确定内部功能有多大变化。但基本的拖放似乎工作正常。