【问题标题】:Add fixed positioned layer to FlowPane [duplicate]将固定定位层添加到 FlowPane [重复]
【发布时间】:2013-08-15 13:41:36
【问题描述】:

我有一个带有面板的 FlowPane,用于在用户面前显示数据。

![在此处输入图片描述][1]

当面板数量大于可见区域时,我还添加了滚动窗格。 我还想添加过滤器,它将按类型对面板进行排序并仅显示适当的面板。红色区域将包含作为过滤器的 ComboBox。

如您所见,红色将 FlowPane 向下推,当我使该区域透明时,这将在顶部组件和滚动之间产生间隙。

有没有办法使用 z-index 并将红色放在 FlowPane 前面?还是其他解决方案?

这是我想要得到的结果:

![在此处输入图片描述][2]

【问题讨论】:

  • 请关闭此问题,因为新问题的措辞更好/更容易理解。

标签: javafx-2 javafx javafx-8


【解决方案1】:

根据您在之前问题中的代码研究此示例:

public class Demo extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        StackPane stackPane = new StackPane();
        stackPane.setAlignment(Pos.TOP_LEFT);
        stackPane.getChildren().addAll(infrastructurePane(), getFilterPane());
        Scene scene = new Scene(stackPane);
        stage.setScene(scene);
        stage.show();
    }

    public Pane getFilterPane() {
        ObservableList<String> options =
                FXCollections.observableArrayList(
                "Option 1", "Option 2", "Option 3");
        ComboBox<String> combo = new ComboBox<String>(options);

        HBox pane = new HBox();
        pane.setPadding(new Insets(20));
        pane.setStyle("-fx-background-color: rgba(255,0,85,0.4)");
        pane.getChildren().add(combo);
        pane.setMaxHeight(40);
        // Optional
        //pane.setEffect(new DropShadow(15, Color.RED));
        return pane;
    }

    public ScrollPane infrastructurePane() {

        final FlowPane flow = new FlowPane();
        flow.setPadding(new Insets(5, 5, 5, 5));
        flow.setVgap(5);
        flow.setHgap(5);
        flow.setAlignment(Pos.CENTER);

        final ScrollPane scroll = new ScrollPane();

        scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);    // Horizontal scroll bar
        scroll.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);    // Vertical scroll bar
        scroll.setFitToHeight(true);
        scroll.setFitToWidth(true);
        scroll.setContent(flow);
//        scroll.viewportBoundsProperty().addListener(new ChangeListener<Bounds>() {
//            @Override
//            public void changed(ObservableValue<? extends Bounds> ov, Bounds oldBounds, Bounds bounds) {
//                flow.setPrefWidth(bounds.getWidth());
//                flow.setPrefHeight(bounds.getHeight());
//            }
//        });

        //flow.setPrefWrapLength(170); // preferred width allows for two columns
        flow.setStyle("-fx-background-color: yellow;");

        for (int i = 0; i < 28; i++) {
            flow.getChildren().add(generateRectangle());
        }

        String cssURL = "/com/dx57dc/css/ButtonsDemo.css";
        String css = this.getClass().getResource(cssURL).toExternalForm();
        flow.getStylesheets().add(css);

        return scroll;
    }

    public Rectangle generateRectangle() {

        final Rectangle rect2 = new Rectangle(10, 10, 10, 10);
        rect2.setId("app");
        rect2.setArcHeight(8);
        rect2.setArcWidth(8);
        //rect2.setX(10);
        //rect2.setY(160);
        rect2.setStrokeWidth(1);
        rect2.setStroke(Color.WHITE);
        rect2.setWidth(220);
        rect2.setHeight(180);

        rect2.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                rect2.setFill(Color.ALICEBLUE);
            }
        });

        return rect2;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

编辑:
根据评论,这是没有窗格的组合。由于没有窗格,因此不会阻止鼠标事件。仅将此方法替换为上述方法:

public ComboBox getFilterPane() {
    ObservableList<String> options =
            FXCollections.observableArrayList(
            "Option 1", "Option 2", "Option 3");
    ComboBox<String> combo = new ComboBox<String>(options);
    combo.setTranslateX(10);
    combo.setTranslateY(10);
    return combo;
}

【讨论】:

  • 是的,这就是我要找的。顺便说一句,我想到了一个想法。当组合框位于面板上方时,它看起来不是很好。例如,可以将面板向下推或使其几乎透明。还有其他想法吗?
  • @PeterPenzov。向下推面板不是选项,因为当矩形向上滚动时,它们仍将停留在组合框的面板下方。否则,您可以将组合框面板和堆栈面板放入 VBox。您可以通过不设置组合框的背景颜色来使组合框面板全透明,请查看上面的代码。
  • @PeterPenzov,题外话,我认为有一天您可能会选择开源您的应用程序,因为我们(作为 SO 的开发人员)正在一步一步地为其开发做出贡献,并做出进一步的贡献将比只看到问题中的屏幕截图更容易:)。开个玩笑。
  • 其实这是我的毕业作品,它是 GPL 许可的。
  • @PeterPenzov。嗯,放轻松,祝你好运!
【解决方案2】:

如果您使用的是 JavaFX 8,您可以尝试来自 ControlsFX project 的通知窗格

看起来像:

【讨论】:

  • ControlsFX 嵌入到 java 8 中还是我必须将其添加为外部 jav 库?
  • JavafX 2.2 还有其他解决方案吗?
  • ControlsFX 第三方开源库仅适用于 Java 8。我不知道 JavaFX 2.2 的类似组件,但我可能错了
  • 好的,你能提出其他解决方案吗?
  • 只有一个...看一下 NotificationPane 的代码(毕竟它是一个开源项目),并将其移植到 JavaFX 2.2。这应该是一个相当简单的任务。这是链接:bitbucket.org/controlsfx/controlsfx/src/…
【解决方案3】:

很难得到你不想要的行为和你想要的行为。

这句话“正如你所见,红色是向下推 FlowPane,当我使该区域透明时,这将在顶部组件和滚动之间产生间隙。”特别难理解。

但是,如果您只是想“使用 z-index 并将红色放在 FlowPane 的前面?”,也许您所要求的只是一个 StackPane ?

StackPane 以从后到前的堆栈形式排列其子项。

孩子的z-order由孩子的顺序定义 列表,第 0 个孩子在底部,最后一个孩子在顶部。如果一个 边框和/或填充已设置,孩子将被布置 在这些插图中。

http://docs.oracle.com/javafx/2/api/javafx/scene/layout/StackPane.html

【讨论】:

    【解决方案4】:

    如果您希望红色区域成为 ScrollPane 的一部分:

    • 创建一个 VBox
    • 将红色区域组件添加到 VBox
    • 将 FlowPane 添加到 VBox
    • 将 VBox 设置为 ScrollPanes 内容

    如果带有 VBox 的布局看起来不令人满意,请尝试使用 Borderpane 并将“红色区域”设置为顶部,并将您的流程窗格设置为中心。


    有没有办法使用 z-index 并将红色放在 FlowPane 前面?还是其他解决方案?

    QuidNovi's answer

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 1970-01-01
      • 2016-07-09
      • 2021-04-27
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      相关资源
      最近更新 更多