我请求您的帮助,因为我在JavaFX中遇到了ScrollPane的问题。
我在scrollPane中添加了一个Group,将scrollpane添加到Scene中,最后将它放入JFXPanel,因为我在Swing应用程序中使用它并且它运行良好,接下来我将组件添加到组中(通过组件我的意思是像矩形等的节点组装......)。这很好用,但是当我想将一个组件移出滚动窗格布局时,组件的移动是无法控制的,它开始移动得非常快,我不明白为什么。当组件的边框触摸滚动窗格布局的边框时,它开始出现麻烦。我尝试使用ScrollBar,但似乎ScrollPane是最合适的对象。
我用以创建视图的代码:
public void createView() {
this.architectureJFXPanel = new JFXPanel();
this.group = new Group();
this.scrollPane = new ScrollPane();
this.scrollPane.setContent(group);
this.scrollPane.setOnKeyPressed(new KeyPressed());
Platform.runLater(new Runnable() {
@Override
public void run() {
Scene scene = new Scene(scrollPane, Color.WHITE);
architectureJFXPanel.setScene(scene);
}
});
}
要将组件放入视图中,我使用group.getChildren.add()
,然后将JFXPanel放入swing应用程序。
以下是我正在尝试做的一个例子。您可以在图片上看到我尝试将组件移出布局:
所以,如果有人已经遇到这种问题并且可以帮助我,我会非常感激:)问我是否需要更多信息来了解问题所在。
答案 0 :(得分:1)
这是我使用ScrollBar解决ScrollPane的问题。
public void setStyle() {
// In my program, TextField controls were generate at run-time, so the prefer height is calculated based on number of controls
int preHeight = 1000;
Group root = new Group();
// This anchor pane contains all control.
AnchorPane anchorPane = new AnchorPane();
// TODO: Add control into this anchor pane
// anchorPane.getChildren().addAll();
final ScrollBar sc = new ScrollBar();
root.getChildren().addAll(anchorPane, sc);
// Set default size for scene to 800 x 600
int sceneW = 800;
int sceneH = 600;
final Scene scene = new Scene(root, sceneW, sceneH);
// Setting for the scroll bar
sc.setLayoutX(scene.getWidth()- sc.getWidth()/2 - 1);
sc.setMin(0);
sc.setOrientation(Orientation.VERTICAL);
sc.setPrefHeight(sceneH);
sc.setMax(preHeight - sceneH);
// In case prefer height is smaller than scene height then hide the scroll bar
if(preHeight < sceneH) {
sc.setVisible(false);
}
scene.setRoot(root);
// Change the scroll bar and the anchor pane when user change scene's width
scene.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> arg0,
Number arg1, Number arg2) {
sc.setLayoutX(arg2.doubleValue()- sc.getWidth()/2 - 1);
anchorPane.setPrefWidth(arg2.doubleValue() - sc.getWidth());
}
});
// Change the scroll bar and the anchor pane when user change scene's height
scene.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> arg0,
Number arg1, Number arg2) {
sc.setMax(preHeight - arg2.doubleValue());
if(arg2.doubleValue() >= preHeight) {
sc.setVisible(false);
}
else {
sc.setVisible(true);
}
sc.setPrefHeight(arg2.doubleValue());
anchorPane.setPrefHeight(arg2.doubleValue());
}
});
// Change the Y position of anchor pane when user scroll the scroll bar
sc.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> ov,
Number old_val, Number new_val) {
anchorPane.setLayoutY(-new_val.doubleValue());
}
});
anchorPane.setPrefSize(scene.getWidth() - sc.getWidth(), scene.getHeight());
}
这种方法存在一个问题,即如果用户使用Tab键在屏幕中的控件之间导航,则滚动条的Y位置将不会更改为相应的位置。您可以通过在锚点窗格中处理可聚焦控件的焦点事件来解决此问题,并相应地设置滚动条的Y位置。