Javafx:导航到Pages

时间:2011-12-03 12:16:45

标签: navigation javafx-2

我正在尝试参考Ensemble示例的JavaFX2.0应用程序。与Ensemble一样,我也想显示不同的页面,但是基于中心页面上的点击。我没有任何树,工具栏等。只是想要根据特定选择显示一组页面。示例:我的主页面可能有6个按钮,点击btn1我想要Page1,Page2 on btn2 click等等。在Page1上,我将再次有一些按钮和Return返回上一页。在普通的Java中,我们可以使用CardLayout轻松实现这一点。将所有分页添加到卡片并显示所需的页面。

看看Enemble项目,我看到所有样本页面都像“AnchorLayout,ColorButton等”,它们都扩展了Sample。 Pages类包含AllPagesPage,SamplesPage,DocPage等的成员,它们都显示在左侧的TreeView中。

我添加了扩展Pane的Sample,创建了另一个扩展Sample的类DataPane。引用所有窗格的第3类:

public class AllPagesPage {
HashMap<String, Sample> pages = null; 
private static String DATAPANE = "DATAPANE";

public AllPagesPage() {
    pages = new HashMap<String, Sample>();
    addPages();
}

private void addPages() {
    pages.put(DATAPANE, (Sample)new DataPane());
}

public Sample getPage(String page) {
    if (pages.containsKey(page))
        return (Sample) pages.get(page);

    return null;

}

}

根据我使用HashMap的名称存储引用。现在在我的应用程序类中,如何将页面设置为DataPane?

    @Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Hello World");
    Group root = new Group();
    Scene scene = new Scene(root, 300, 250);
    /*
    Button btn = new Button();
    btn.setLayoutX(100);
    btn.setLayoutY(80);
    btn.setText("Hello World");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            System.out.println("Hello World");
        }
    });
    root.getChildren().add(btn);
    * 
    */

    primaryStage.setScene(scene);
    primaryStage.show();
}

// Should be called as gotoPage(AllPagesPage.DATAPANE), 
// on this command everythign else should be removed and contents of DataPane should come up.      
public void goToPage(String page) {

}

DataPane只包含Constructor中AnchorPaneSample的代码。没有更多或没有其他功能 - 只有构造函数。

如何调用舞台并设置调用gotoPage(String page)方法的页面???

1 个答案:

答案 0 :(得分:1)

只需创建一个您想要查看窗格的区域并进行更改:

public class Main extends Application {

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

    private Pane pagesArea;
    private AllPagesPage pages = new AllPagesPage();

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World");
        VBox root = new VBox();
        Scene scene = new Scene(root, 300, 250);

        Button btn = new Button();
        btn.setText("Open DataPane");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent event) {
                goToPage(AllPagesPage.DATAPANE);
            }
        });
        root.getChildren().addAll(btn, pagesArea = new StackPane());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void goToPage(String page) {
        Pane pane = pages.getPage(page);
        if (pane != null) {
            pagesArea.getChildren().clear();
            pagesArea.getChildren().add(pane);
        }
    }
}

您可能想要更新AllPagesPage类:

  • getPage()中的验证是多余的,HashMap将为您完成
  • 而不是静态字符串,您可能希望使用枚举以获得更好的灵活性(它将允许迭代,简单比较,更容易重构等)