Вопрос

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

Глядя на проект Hegble, я увидел, что все страницы образцов, такие как «Anchorlayout, Colorbutton и т. Д.» Все они расширяют образец. И в классе страниц есть члены AllPagesPage, Samplespage, Docpage и т. Д., Которые показаны в деревьях с левой стороны.

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

Как мне получить сцену и установить страницы на методе Call To GotoPage (String Page) ???

Это было полезно?

Решение

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

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 для лучшей гибкости (это позволит итерация, простое сравнение, проще рефакторинг и другие)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top