2011-12-03 45 views
0

我想參考Ensemble示例的JavaFX2.0應用程序。和Ensemble一樣,我也想顯示不同的頁面,但是基於中心頁面上的點擊。我沒有任何樹,工具欄等。只需要基於特定選擇顯示一組頁面。例如:我的主頁面可能有6個按鈕,單擊btn1我想要Page1,Page2點擊btn2等等。在Page1上,我會再次有一些按鈕和一個返回返回到上一頁。在普通的Java中,我們可以使用CardLayout輕鬆實現這一點。將所有分頁添加到卡片並顯示所需的頁面。看看Enemble項目,我看到所有的示例頁面都像「AnchorLayout,ColorButton等」,它們都擴展了Sample。並且Pages類具有AllPagesPage,SamplesPage,DocPage等的成員,這些成員都顯示在左側的TreeView中。Javafx:導航到頁

我添加了擴展窗格的樣例,創建了另一個擴展了樣例的類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的名稱refernce。現在在我的應用程序類中,如何將頁面設置爲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只包含來自AnchorPaneSample的構造函數中的代碼。沒有更多或沒有其他功能 - 只有構造函數。

我應該如何獲取舞臺並設置頁面調用gotoPage(String page)方法???

回答

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中將爲你做
  • 而不是靜態字符串你可能想要使用枚舉更好的靈活性(這將允許迭代,純比較,更容易重構等)
+0

謝謝你的開始。如果HashMap不好,那麼我應該使用ArrayList還是使用枚舉?另外,在DatePane中我想設置另一個頁面,讓我們說MainPane。我必須從DataPane btn事件中爲此調用goToPage。所以要麼讓gotoPane靜態(這是不正確的),要麼將應用程序的obj ref傳遞給所有其他頁面。你認爲應該怎樣解決? – Tvd

+1

HashMap很好。我的意思是說你不需要額外的課程。只需將地圖添加到主類。關於你的第二個問題:你可以將ref傳遞給Main類到應用程序,這是正確的方法。或者你可以讓Main類成爲一個單例,並且使用靜態getter,而你的調用看起來像Main.getInstance()。toToPage(page.MainPage); –

+0

謝謝謝爾蓋。如果實現枚舉,那麼爲什麼不使用EnumMap而不是HashMap。我試過這段代碼,但在EnumMap的insitialize行中發生錯誤: public enum Pages { DATAPANE(「DATAPANE」); 私有字符串值; private pages(String s){value = s; } }; EnumMap pagesMap = new EnumMap (Pages.class); 而不是樣品,我也嘗試與字符串也,但也只在該單行中得到錯誤。試圖刪除Paes.class,也沒有工作。我在這裏做出的那個愚蠢的錯誤找不到。你能指出嗎? – Tvd