2011-12-03 28 views
0

Ensembleサンプルを参照してJavaFX2.0アプリケーションを試しています。アンサンブルのように、私はまた、異なるページを表示したいが、センターページ上のクリックに基づいています。私はツリー、ツールバーなどは一切持っていません。特定の選択に基づいてページのセットを表示したいだけです。例:私のメインページには6つのボタンがあり、btn1をクリックするとPage1、Page2はbtn2をクリックするPage2などがあります。 Page1には、いくつかのボタンとReturnがあり、前のページに戻ります。通常のJavaでは、CardLayoutを使用して簡単にこれを実現できます。すべてのページをカードに追加し、目的のページを表示します。Javafx:ページに移動

Enembleプロジェクトを見ると、「AnchorLayout、ColorButtonなど」のようなすべてのサンプルページがすべてサンプルを拡張していることがわかりました。 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を使用しました。今ではアプリケーションクラスで、ページをデータパネルとしてセットアップするにはどうすればよいですか?

@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) { 

} 

データパネルには、コンストラクタのAnchorPaneSampleのコードが含まれています。それ以上の機能はありません。コンストラクタのみです。

gotoPage(Stringページ)メソッドの呼び出し時に、ステージとページをどのように取得する必要がありますか?

答えて

1

ちょうどあなたがあなたのペインに表示され、それらを変更したいエリアを作成:あなたはあなたのAllPagesPageクラスを更新することもできます

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); 
     } 
    } 
} 

を:GETPAGEで

  • 検証は()、HashMapの冗長ですあなたのためにそれを行います
  • 静的な文字列の代わりに、より良い柔軟性のためにenumを使用することができます(反復、簡単な比較、簡単なリファクタリングなどが可能)
+0

ご協力ありがとうございます。 HashMapがうまくいかない場合は、ArrayListを使用するか、enumを使用する必要がありますか?また、DatePaneで別のページを設定したい、MainPaneと言うことができます。 DataPane btnイベントからgoToPageを呼び出す必要があります。だから、gotoPaneを静的にする(適切ではない)か、アプリケーションのobj refを他のすべてのページに渡す必要があります。何がうまくいくと思いますか? – Tvd

+1

ハッシュマップは問題ありません。私はあなたがそれのために追加のクラスを必要としないことを意味しました。メインクラスにマップを追加するだけです。あなたは2番目の質問について:あなたはアプリケーションにメインクラスにrefを渡すことができます、これは正しいアプローチです。または、Mainクラスをシングルトンにし、静的なgetterを使用するとMain.getInstance()。toToPage(page.MainPage)のようになります。 –

+0

ありがとうSergey。 enumを実装する場合は、HashMapではなくEnumMapを使用してください。私はこのコードを試みたが、EnumMapの行をinsitializeでエラーになる。 public enum Pages { DATAPANE( "DATAPANE"); プライベート文字列値。 プライベートページ(文字列){値= s; } }; EnumMap pagesMap =新しいEnumMap (Pages.class); サンプルの代わりに、私もStringを試しましたが、その1行だけでもエラーが発生します。 Paes.classを削除しようとしましたが、これも機能しませんでした。私がここで作っている愚かな間違いは見つけられません。あなたは指摘できますか? – Tvd

関連する問題