我编写了一个程序,它使用了 javafx中的拖放功能.在 JavaFX8中它完美运行.

在JavaFX11中,拖放操作功能失效:我没有得到不同的鼠标光标,我没有得到我正在拖动的行的鬼图像,而且滴有问题 – 它们不会触发鼠标释放,然后每次我点击表格时触发掉落.

这是最小的可运行示例,它演示了我面临的问题.在Java 8 JVM上运行它可以根据需要运行.在Java 11 JVM上它没有.我在Ubuntu 18.04上.

我很好地改变我的代码以适应Java 11,但我不知道我做错了什么.

Java 11版

java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS,mixed mode)

Java 8版

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-1ubuntu0.18.04.1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13,mixed mode)

DND11.java

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.stage.Stage;

public class DND11 extends Application {

    public TableView<Person> getTable () {
        DataFormat DRAGGED_PERSON = new DataFormat ( "application/example-person" );

        TableColumn <Person,String> firstNameColumn = new TableColumn <> ( "First Name" );
        TableColumn <Person,String> LastNameColumn = new TableColumn <> ( "Last Name" );

        firstNameColumn.setCellValueFactory( new PropertyValueFactory <Person,String>( "firstName" ) );
        LastNameColumn.setCellValueFactory( new PropertyValueFactory <Person,String>( "lastName" ) );

        TableView <Person> tableView = new TableView <> ();
        tableView.getColumns().addAll( firstNameColumn,LastNameColumn );
        tableView.setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY );

        tableView.setEditable( false );
        tableView.setItems( FXCollections.observableArrayList( Person.generatePersons ( 10 ) ) );

        tableView.getSelectionModel().setSelectionMode( SelectionMode.MULTIPLE );

        tableView.setRowFactory( tv -> {
            TableRow <Person> row = new TableRow <>();

            row.setonDragDetected( event -> {
                if ( !row.isEmpty() ) {
                    Dragboard db = row.startDragAndDrop( TransferMode.copY );
                    ClipboardContent cc = new ClipboardContent();
                    cc.put( DRAGGED_PERSON,row.getItem() );
                    tableView.getItems().remove( row.getItem() );
                    db.setContent( cc );
                }
            });

            row.setonDragOver( event -> {
                Dragboard db = event.getDragboard();
                event.acceptTransferModes( TransferMode.copY );
            });

            row.setonDragDropped( event -> {
                Dragboard db = event.getDragboard();

                Person person = (Person)event.getDragboard().getContent( DRAGGED_PERSON );

                if ( person != null ) {
                    tableView.getItems().remove( person );
                    int dropIndex = row.getIndex();
                    tableView.getItems().add( dropIndex,person );
                }

                event.setDropCompleted( true );
                event.consume();
            });

            return row;
        });

        return tableView;
    }

    @Override
    public void start ( Stage stage ) throws Exception {
        stage.setScene( new Scene( getTable(),800,400 ) );
        stage.show();

    }

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

Person.java

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Person implements Serializable {

    private static final long serialVersionUID = 1L;

    private String firstName,lastName;

    public Person ( String firstName,String lastName ) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public static List <Person> generatePersons ( int number ) {
        List<Person> retMe = new ArrayList<Person> ( number );
        for ( int k = 0; k < number; k++ ) {
            retMe.add ( new Person ( randomFirstName(),randomLastName() ) );
        }
        return retMe;
    }


    private static Random rand = new Random();

    private static String randomFirstName() {
        return firstNames [ Math.abs( rand.nextInt() ) % firstNames.length ];
    }

    private static String randomLastName() {
        return lastNames [ Math.abs( rand.nextInt() ) % lastNames.length ];
    }

    private static String[] firstNames = new String[] {
        "ANTON","ANTONE","ANTONIA","NTONIO","ANTONY","ANTWAN","ARCHIE","ARDEN","ARIEL","ARLEN","ARMAND","ARMANDO","ARNOLD","ARNOLDO","ARNULF","ARON","ARRON","ART","ARTHUR","ARTURO","DARRICK","DARRIN","DARRON","DARRYL","DARWIN","DARYL","DAVE","DAVID","DAVIS","DEAN",};

    private static String[] lastNames = new String[] {
        "SMITH","JOHNSON","WILLIAMS","broWN","JOnes","MILLER","GARCIA","RODRIGUEZ","WILSON","MARTINEZ","ANDERSON","TAYLOR","THOMAS","HERNANDEZ","MOORE","MARTIN","JACKSON"
    };
}

解决方法

虽然JavaFX中的Drag and Drop具有适用于所有平台的通用API(当然,作为API的其余部分),但其内部实现依赖于平台,并且在Windows,Mac或Linux上完全不同.

但是,从JavaFX 8迁移到JavaFX 11时,这不应该是一个问题.

OP发布的示例在Windows和Mac上与JavaFX 8和11的工作方式相同,如果在Linux上不是这种情况,则可能与最新版本的JavaFX for Linux中所做的更改有关.

根据releases note,在重要变更部分,我们可以看到:

Switch default GTK version to 3

JavaFX will Now use GTK 3 by default on Linux platforms where the gtk3 library is present. Prior to JavaFX 11,the GTK 2 library was the default. This matches the default for AWT in JDK 11. See JDK-8198654 for more information.

虽然这个change基本上是JavaFX代码中的两行差异,并且没有从DND的实现细节改变,但GTK 3实现可能已经从GTK 2改变了,并且这些改变没有被考虑在内.

据报道,dialogs,windows或Wayland crashes与GTK有关的类似问题.

解决方法

到目前为止,所有这些问题的唯一已知解决方法是使用GTK 2运行应用程序,可以使用系统属性设置:jdk.gtk.version.

因此可以在命令行上添加此选项:

java -Djdk.gtk.version=2 ...

运行应用程序.

正如评论中所述,这似乎解决了拖放问题.

报告问题

当然,这确认这是一个问题,因此它应该在OpenJFX问题tracker提交,提供重现它的示例代码,系统细节(操作系统版本,Java版本,JavaFX版本……).

javafx – Java 11与Java 8中的拖放工作方式不同的更多相关文章

  1. NSDateComponents周在iOS8上的工作方式不同

    自iOS8以来,不推荐使用NSDateComponents周.Apple建议使用weekOfMonth或weekOfYear,具体取决于上下文,但它们的工作方式不同.例如:components1返回month=0,week=1,day=0,weekOfMonth和weekOfYear都等于2147483647.components2返回month=1,week=0,weekOfMonth和weekOfYear都等于2147483647.Week返回某段时间内的周数,并且与一个月或一年中的一周的数量完全不同

  2. ios – Xcode 8 Beta中的约束和大小类

    我正在尝试在我的应用中创建与我的肖像限制不同的景观约束.通常我在以前版本的Xcode中使用大小类,但我使用的是测试版,我看到的只是设备.如何在Xcode8中使用这个新UI来处理大小类?

  3. android – 如何在API 19(kitkat)上设置精确的重复警报?

    即什么是旧的setRepeating()的API19版本?你能否提供一个在KitKat每天早上7:30设置闹钟的例子?

  4. .net – 了解dll及其在Visual Studio中的工作方式

    有没有人在dll上有一个很好的资源以及如何在VisualStudio中使用/生成它们?

  5. javafx – Java 11与Java 8中的拖放工作方式不同

    我编写了一个程序,它使用了javafx中的拖放功能.在JavaFX8中它完美运行.在JavaFX11中,拖放操作功能失效:我没有得到不同的鼠标光标,我没有得到我正在拖动的行的鬼图像,而且滴有问题–它们不会触发鼠标释放,然后每次我点击表格时触发掉落.这是最小的可运行示例,它演示了我面临的问题.在Java8JVM上运行它可以根据需要运行.在Java11JVM上它没有.我在Ubuntu18.04上.我很

  6. java – 限制JTextPane内存使用量

    我有一个应用程序,它不断地在套接字上接收数据,然后将这些数据记录到文件中,同时在JTextPane中显示这些数据.当然,随着数据被写入JTextPane的底层文档,内存使用量继续增加.是否有一种简单的方法来限制允许使用JTextPane的内存?只是为了给你这个想法.当然应该在向textPane添加文本之前运行它.顺便说一下,如果您没有使用JTextPane的丰富编辑器功能,我建议您使用更简洁的JTextArea.

  7. javascript – Cycle2插件的初始化在Windows上的工作方式与在OSX上的工作方式不同

    如果有关于此的类似问题,请指出我的方向.这个问题很难描述,但我会尽我所能:http://jsfiddle.net/e70r1mtw/这里的用户可以看到从灰度渐变到彩色的幻灯片.这适用于OSX和Windows中的Firefox.(客户端知道这种效果在IE中不起作用,并且可以.)但是,在Windows上的Chrome中,第一张幻灯片不会从灰度渐变,而是保持颜色.我怀疑这与DOM的加载方式以及Cycle

  8. Delphi 7的线程工作方式的一些心得

    总结以上是DEVMAX为你收集整理的Delphi7的线程工作方式的一些心得全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  9. 快速理解vue的工作方式

    总结以上是DEVMAX为你收集整理的快速理解vue的工作方式全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. 多线程 – 在Delphi 2006控制台应用程序中,TThread的工作方式是否有所不同?

    我们有一个非常成熟的COMdll,我们使用DUnit进行测试.我们最近的一个测试创建了一些线程,并从这些线程测试对象.使用gui前端运行测试时此测试工作正常,但在作为控制台应用程序运行时挂起.这是我们在测试中所拥有的快速伪视图我已经尝试在OnExecute中做任何事情,所以我确定这不是我正在测试的实际代码.在控制台中,fThreadRefCount永远不会减少,而如果我将它作为gui应用程序运行,那很好!

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部