这看起来像是应该使用一个
VBox
来容纳您的
AnchorPane
并将它们放置在
ScrollPane
中。在
ScrollPane
上设置
fitToWidth
为
true
,这样就应该强制锚点面板占据滚动面板视口的整个宽度(且不超过),假设您没有从其默认值更改
AnchorPane
的
maxWidth
属性。
模拟示例(如果您愿意,可以轻松地在FXML中完成):
import java.util.Random;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ScrollingVBox extends Application {
@Override
public void start(Stage primaryStage) {
final Random rng = new Random();
VBox content = new VBox(5);
ScrollPane scroller = new ScrollPane(content);
scroller.setFitToWidth(true);
Button addButton = new Button("Add");
addButton.setOnAction(e -> {
AnchorPane anchorPane = new AnchorPane();
String style = String.format("-fx-background: rgb(%d, %d, %d);"+
"-fx-background-color: -fx-background;",
rng.nextInt(256),
rng.nextInt(256),
rng.nextInt(256));
anchorPane.setStyle(style);
Label label = new Label("Pane "+(content.getChildren().size()+1));
AnchorPane.setLeftAnchor(label, 5.0);
AnchorPane.setTopAnchor(label, 5.0);
Button button = new Button("Remove");
button.setOnAction(evt -> content.getChildren().remove(anchorPane));
AnchorPane.setRightAnchor(button, 5.0);
AnchorPane.setTopAnchor(button, 5.0);
AnchorPane.setBottomAnchor(button, 5.0);
anchorPane.getChildren().addAll(label, button);
content.getChildren().add(anchorPane);
});
Scene scene = new Scene(new BorderPane(scroller, null, null, addButton, null), 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
另一个解决方案可能是使用 ListView
。(如果您有许多要显示的项目,这将是更好的选择。)创建一个表示每个 AnchorPane
中显示的项目的类,以及一个自定义列表单元格来显示它们。
ScrollPane
中使用VBox
简单地完成这个。对于VBox
,设置fillWidth="true"
,对于ScrollPane
,设置fitToWidth="true"
。如果你想要一个GridPane
,使用columnConstraints
来控制宽度。但是,如果你想要更完整的答案,请创建一个简单的示例并发布一些代码。 - James_DfitToWidth
设置为true
应该就足够了。 - James_D