Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX滚动条设置鼠标按下不工作_Java_Javafx - Fatal编程技术网

JavaFX滚动条设置鼠标按下不工作

JavaFX滚动条设置鼠标按下不工作,java,javafx,Java,Javafx,非常喜欢JavaFX,但遇到了这个问题,并怀疑这是否是一个bug 当使用处理程序初始化ScrollBar.setOnMousePressed()时,它似乎不会启动。下面的代码演示了该问题:- import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ScrollBar; import javafx

非常喜欢JavaFX,但遇到了这个问题,并怀疑这是否是一个bug

当使用处理程序初始化ScrollBar.setOnMousePressed()时,它似乎不会启动。下面的代码演示了该问题:-

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

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

    private static int cnt;

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Bug?");
        Button btn = new Button("This text will get replaced by the event handlers");

        ScrollBar scrollBar = new ScrollBar();

        // When pressing and releasing the ScrollBar thumb, we only get decrements
        // If you replace the ScrollBar with say a Button, then the code below works as you might expect.
        scrollBar.setOnMousePressed( event -> btn.setText("X" + cnt++));
        scrollBar.setOnMouseReleased( event -> btn.setText("X" + cnt--));

        VBox root = new VBox();
        root.getChildren().add(btn);
        root.getChildren().add(scrollBar);

        primaryStage.setScene(new Scene(root, 350, 250));
        primaryStage.show();
    }
}

注意,我在Microsoft Windows 10上的JDK 1.8.0_66 64位上运行。

正如James_D所建议的,一个简单的解决方法是使用EventFilters,而不是setOnMousePressed(),如下所示:-

所以

而不是

scrollBar.setOnMousePressed( event -> btn.setText("X" + cnt++));

我相信.setOnMousePressed()应该可以工作,但因为库中有一个bug,所以不能工作。我已经向oracle提出,oracle澄清后将更新答案。

可能是处理滚动条上鼠标事件的处理程序(为了提供其常规功能)使用鼠标单击事件。如果改用事件筛选器,则其行为与预期一致。对于类似的事情,您的实际用例是什么(即,为什么您在这样的控件上使用相当低级别的事件处理)?这是我的想法,但为什么这不会发生在按钮上?此外,所有其他事件都按预期工作,包括mouseClicked和mouseRelease。这似乎前后矛盾。该用例是我过去使用Swing成功完成的一项工作,在用户拖动滚动条拇指时,我会弹出一个工具提示,显示自定义控件中的位置。我将尝试您建议的事件过滤器,然后返回给您。另一种方法可能是直接用拇指注册工具提示。我还没有尝试过这个,但您应该能够通过查找来完成它:
Node thumb=scrollBar.lookup(“.thumb”)
工具提示工具提示=新工具提示()
工具提示。安装(拇指,工具提示)。然后将工具提示的文本绑定到滚动条的
属性。这将是一个稍微不同的UX(工具提示会在悬停时弹出,即使没有更改),但可能工作正常。与任何UI工具包一样,JavaFX在某些方面做得非常好(例如,可观察属性和CSS蒙皮),而在某些方面做得不太好。修改控件默认行为(即更改或添加控件对用户输入的反应方式)的能力在当前版本中肯定做得不好。我们希望在以后的版本中这可能会有所改进:我知道皮肤类在JavaFX9中成为公共API,这是向前迈出的一步,但还不足以让这类事情变得更简单。
scrollBar.setOnMousePressed( event -> btn.setText("X" + cnt++));