Javafx: переход на страницы - PullRequest
       3

Javafx: переход на страницы

0 голосов
/ 03 декабря 2011

Я пытаюсь использовать приложение JavaFX2.0 со ссылкой на образец Ensemble. Как и Ensemble, я также хочу показывать разные страницы, но на основе кликов, сделанных на центральной странице. У меня нет дерева, панели инструментов и т. Д. Просто хочу, чтобы набор страниц отображался на основе определенного выбора. Пример: моя главная страница может иметь 6 кнопок, при нажатии btn1 я хочу Page1, Page2 при нажатии btn2 и так далее. На странице 1 у меня снова будут несколько кнопок и кнопка «Возврат» для возврата на предыдущую страницу. В обычной Java мы могли бы легко добиться этого, используя CardLayout. Добавьте все постраничные карточки и покажите нужную страницу

Глядя на проект Enemble, я увидел, что все примеры страниц, такие как «AnchorLayout, ColorButton и т. Д.», Все они расширяют Sample. И у класса Pages есть члены AllPagesPage, SamplesPage, DocPage и т. Д., Которые все показаны в TreeView на левой стороне.

Я добавил Sample, расширяющий Pane, создаю еще один класс DataPane, расширяющий Sample. Третий класс, имеющий ссылку на все панели:

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 просто содержит код из AnchorPaneSample в конструкторе. Ничего больше или никаких других функций - ТОЛЬКО конструктор.

Как получить сцену и настроить страницы при вызове метода gotoPage (String page) ???

1 Ответ

1 голос
/ 03 декабря 2011

Просто создайте область, где вы хотите видеть свои панели и измените их:

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 сделает это за вас
  • вместо статических строк вы можете использовать enum для большей гибкости (это позволит выполнять итерации, простое сравнение, упростить рефакторинг и другие)
...