JavaFX手风琴向导



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

我通过在手风琴下面添加"Previous"one_answers"Next"按钮来实现这一点,并将手风琴的鼠标透明度设置为true。到目前为止一切都很好。用户可以从面板1走到面板5,然后返回…

不幸的是(出于任何奇怪的原因),用户不能在不同的面板中配置任何东西。等待……我将鼠标透明度设置为"true",对吧…但是当我将其设置为false时,用户可以不按任何顺序跳过面板。

有什么建议吗?

一种可能的方法是将所有窗格的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,当前的"向导页面"在中心,下一步和上一个按钮在底部。如果需要的话,还可以添加breadcrumb trail。

最新更新