如何在JavaFX中创建可滚动的组件面板?

时间:2015-05-07 15:07:23

标签: javafx panel scrollpane

所以,基本上,我试图用间距等来实现这个可滚动的组件集,并且能够添加更多组件。 组件列表是自定义anchorpane组件。

以下是我工作的一个例子: enter image description here

问题是在滚动窗格内使用网格窗格,由于某种原因,网格窗格根本不会填充滚动窗格的宽度。因此,如果我调整大小,一切都保持原样,而不是在gridpane列内拉伸。另外,如果我要坚持使用gridpane(在tilepane上看起来效果更好,除非组件彼此浮动,尽管方向是垂直的并且prefcolumns为1),我将如何添加更多行?这个想法是以一种不错的,用户体验的方式列出github repos。

感谢您的任何见解。 另外:那些回购不是我的 - 我没有,一个网站上的人做了(它做得不好,所以不要把我和他比较)。

1 个答案:

答案 0 :(得分:5)

看起来您应该使用VBox来保留AnchorPane并将其放入ScrollPane。在fitToWidth上将true设置为ScrollPane,它应该强制锚定窗格占据滚动窗格视口的整个宽度(而不是更多),假设您没有& #39; t更改maxWidthAnchorPane的默认属性。

模拟示例(如果您愿意,可以在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中显示的项目的类和一个自定义列表单元格以显示它们。