Navigation Javafx:导航到页面

Navigation Javafx:导航到页面,navigation,javafx-2,Navigation,Javafx 2,我正在尝试一个JavaFX2.0应用程序,参考集成示例。和Ensemble一样,我也希望显示不同的页面,但基于在中心页面上的点击。我没有任何树、工具栏等,只是希望根据特定选择显示一组页面。示例:我的主页可能有6个按钮,单击btn1我想要第1页,单击btn2第2页,依此类推。在第1页,我将再次有一些按钮和返回到上一页。在普通Java中,我们可以使用CardLayout轻松实现这一点。将所有页面添加到卡片并显示所需页面 查看Enemble项目,我看到所有的示例页面,如“AnchorLayout、Co

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

查看Enemble项目,我看到所有的示例页面,如“AnchorLayout、ColorButton等”,它们都扩展了示例。Pages类有AllPagesPage、SamplePage、DocPage等的成员,这些成员都显示在左侧的树视图中

我添加了扩展示例窗格的示例,创建了另一个扩展示例的类DataPane。具有所有窗格参考的第三类:

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 pages=null;
专用静态字符串DATAPANE=“DATAPANE”;
公共AllPagesPage(){
pages=新HashMap();
addPages();
}
私有void addPages(){
pages.put(DATAPANE,(示例)newdatapane());
}
公共示例getPage(字符串页){
if(第页,集装箱箱(第页))
返回(示例)页面。获取(页面);
返回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) {

}
@覆盖
公共无效开始(阶段primaryStage){
setTitle(“你好世界”);
组根=新组();
场景=新场景(根,300,250);
/*
按钮btn=新按钮();
btn.设置布局X(100);
btn.设置布局(80);
btn.setText(“你好世界”);
btn.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
System.out.println(“你好世界”);
}
});
root.getChildren().add(btn);
* 
*/
初级阶段。场景(场景);
primaryStage.show();
}
//应称为gotoPage(AllPagesPage.DATAPANE),
//在这个命令上,所有其他的符号都应该被删除,DataPane的内容应该出现。
公共无效goToPage(字符串页){
}
DataPane只包含构造函数中AnchorPaneSample的代码。没有更多或没有其他函数-仅构造函数


我应该如何使用gotoPage(字符串页面)方法获取舞台和设置页面?

只需创建一个区域,以便查看窗格并对其进行更改:

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);
        }
    }
}
public类主扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
私人版页a;
private AllPagesPage=new AllPagesPage();
@凌驾
公共无效开始(阶段primaryStage){
setTitle(“你好世界”);
VBox root=新的VBox();
场景=新场景(根,300,250);
按钮btn=新按钮();
btn.setText(“打开数据窗格”);
btn.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
goToPage(AllPagesPage.DATAPANE);
}
});
root.getChildren().addAll(btn,pagesArea=newstackpane());
初级阶段。场景(场景);
primaryStage.show();
}
公共无效goToPage(字符串页){
窗格=页面。获取页面(第页);
如果(窗格!=null){
pagesArea.getChildren().clear();
pagesArea.getChildren().add(窗格);
}
}
}
您可能需要更新AllPagesPage类:

  • getPage()中的验证是多余的,HashMap将为您执行此操作
  • 为了更好的灵活性,您可能希望使用enum而不是静态字符串(它将允许迭代、简单比较、更容易的重构和其他)

谢谢你的开始。如果HashMap不好,那么我应该使用ArrayList还是enum?另外,在DatePane中,我想设置另一个页面,比如MainPane。我必须从DataPane btn事件中为此调用goToPage。所以要么让gotoPane成为静态的(这是不合适的),要么将应用程序的obj引用传递给所有其他页面。你认为应该怎么做?HashMap很好。我的意思是你不需要额外的课程。只需将map添加到主类。关于第二个问题:可以将主类的ref传递给应用程序,这是正确的方法。或者,您可以将Main类设置为单例类,并使用静态getter,您调用的将类似于Main.getInstance().toToPage(page.MainPage);谢谢你,谢尔盖。如果实现enum,那么为什么不使用EnumMap而不是HashMap呢。我尝试了这段代码,但在EnumMap insitialize行中出现错误:public enum Pages{DATAPANE(“DATAPANE”);private String value;private Pages(String s){value=s;};EnumMap pagesMap=新的EnumMap(Pages.class);我也尝试使用字符串来代替示例,但随后也只在这一行中得到了错误。尝试删除Paes.class,但也不起作用。我在这里犯了什么愚蠢的错误?我找不到。你能指一下吗?不客气。关于使用EnumMap,您是对的。初始化字符串中的泛型参数位置错误。下面是正确的一个:EnumMap pagesMap=newEnumMap(Pages.class);