非常喜欢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位。
答案 0 :(得分:1)
James_D建议的一个简单的解决方法是使用EventFilters而不是setOnMousePressed(),如下所示: -
所以,
scrollBar.addEventFilter(MouseEvent.MOUSE_PRESSED,
event -> btn.setText("X" + cnt++));
而不是
scrollBar.setOnMousePressed( event -> btn.setText("X" + cnt++));
我相信.setOnMousePressed()应该可以工作,但不会因为库中的错误而导致。我已经与oracle一起成长,并会在oracle澄清后更新答案。