Javafx: перейдите на страницы
-
27-10-2019 - |
Вопрос
Я пробую приложение 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 для лучшей гибкости (это позволит итерация, простое сравнение, проще рефакторинг и другие)