我目前正在为视频编辑编写基于JavaFX的GUI程序。在这里,我遇到了一个关于ScrollPane的问题。我无法想出如何使ScrollPane(真正)pickOnBounds=”false”。也就是说,我实际上可以通过ScrollPane点击下面的Node。我认为这可能与ScrollPane的视口有关。以下是我们程序的大大简化版本:
Styles.css
.scroll-pane > .viewport {
-fx-background-color: transparent;
-fx-background-radius: 4;
}
sample.fxml
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.control.ScrollPane?>
<StackPane
xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="sample.Controller" fx:id="myStackPane">
<Pane onMousePressed="#onMouseInteraction" style="-fx-background-color: red"/>
<AnchorPane fx:id="markerIconPane" pickOnBounds="false">
<ScrollPane style="-fx-background-color: transparent" pickOnBounds="false" vbarPolicy="ALWAYS" hbarPolicy="ALWAYS"/>
</AnchorPane>
</StackPane>
Controller.java
package sample;
import javafx.scene.input.MouseEvent;
import javafx.fxml.FXML;
public class Controller implements Initializable {
//...
public void onMouseInteraction(MouseEvent mouseEvent) {
System.out.println(mouseEvent.getX());
}
}
Main.java
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
root.getStylesheets().add("./Styles.css");
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
现在你可以清楚地看到左上角的滚动条。当你按下滚动条外面的红色区域时,会调用onMouseInteraction()
,但当你在滚动条内部按下时,什么也不会发生。
提前感谢
菲利普