使用JavaFX Accordions的向导

时间:2016-09-26 19:50:24

标签: javafx accordion

我正在编写一个小型配置向导式JavaFX应用程序。我想强制用户完成配置窗格的不同步骤。所以我选择了一个带有几个面板的手风琴容器。用户只能进入NEXT或PREVIOUS手风琴面板,但不能从面板1跳到3。

我通过在手风琴下添加“上一个”和“下一个”按钮来实现这一点,并将手风琴的鼠标透明度设置为true。到目前为止一切正常。用户可以从面板1到5然后返回......

不幸的是(由于任何奇怪的原因)用户无法在不同的面板中配置任何内容。等等......我将鼠标透明度设置为“true”,正确...但是当我将其设置为false时,用户可以跳过面板而无需任何顺序。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

一种可能的方法是将所有窗格的collapsible属性设置为false,并在需要展开或折叠时将每个窗格设置为true(可以通过编程方式执行) 。这有点难看,但这是一个例子:

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class AccordionBasedWizard extends Application {

    @Override
    public void start(Stage primaryStage) {
        Accordion accordion = new Accordion();

        for (int i = 0 ; i < 5 ; i++) {
            TitledPane pane = new TitledPane("Page "+(i+1), new Label("Wizard page "+(i+1)));
            accordion.getPanes().add(pane);
            pane.setCollapsible(false);
        }


        accordion.setExpandedPane(accordion.getPanes().get(0));

        Button previousButton = new Button("Previous");
        previousButton.disableProperty().bind(accordion.expandedPaneProperty().isEqualTo(accordion.getPanes().get(0)));
        previousButton.setOnAction(e -> {
            TitledPane current = accordion.getExpandedPane();
            int index = accordion.getPanes().indexOf(current);
            TitledPane previous = accordion.getPanes().get(index - 1);
            current.setCollapsible(true);
            previous.setCollapsible(true);
            accordion.setExpandedPane(previous);
            previous.setCollapsible(false);
            current.setCollapsible(false);
        });

        Button nextButton = new Button("Next");
        nextButton.disableProperty().bind(accordion.expandedPaneProperty().isEqualTo(accordion.getPanes().get(accordion.getPanes().size()-1)));
        nextButton.setOnAction(e -> {
            TitledPane current = accordion.getExpandedPane();
            int index = accordion.getPanes().indexOf(current);
            TitledPane next = accordion.getPanes().get(index + 1);
            current.setCollapsible(true);
            next.setCollapsible(true);
            accordion.setExpandedPane(next);
            next.setCollapsible(false);
            current.setCollapsible(false);
        });

        HBox buttons = new HBox(5, previousButton, nextButton);
        buttons.setAlignment(Pos.CENTER);
        buttons.setPadding(new Insets(5));

        BorderPane root = new BorderPane(accordion);
        root.setBottom(buttons);

        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }


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

对于它的价值,我可能不会尝试使用Accordion作为向导,而只使用BorderPane,使用当前的&#34;向导页面&#34;在中间以及底部的下一个和上一个按钮。如果需要,您也可以添加面包屑跟踪。