0

我正在尝试参考 Ensemble 示例的 JavaFX2.0 应用程序。像 Ensemble 一样,我也想显示不同的页面,但基于中心页面上的点击。我没有任何树、工具栏等。只想根据特定选择显示一组页面。示例:我的主页可能有 6 个按钮,在单击 btn1 时我想要 Page1,在 btn2 上单击 Page2 等等。在第 1 页上,我将再次有一些按钮和一个返回以返回到上一页。在普通 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) 方法时获取舞台和设置页面???

4

1 回答 1

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 会为您完成
  • 而不是静态字符串,您可能希望使用枚举以获得更好的灵活性(它将允许迭代、简单比较、更容易重构等)
于 2011-12-03T12:52:29.880 回答