Приложение JavaFX с множеством страниц

У меня есть вопрос о создании графического интерфейса в javafx.

Когда я создаю программу с большим количеством страниц, я имею в виду, например, что стартовая страница содержит пару кнопок «Добавить пользователя», «Удалить пользователя», «Изменить данные пользователя» - каждая из этих кнопок отображает отдельную панель. И вот у меня вопрос - как их организовать. Когда я помещаю все панели в один класс, он быстро становится огромным и порождает множество ошибок. Также сложно найти часть кода, которая сломана. Следует ли определять каждую панель в отдельном классе? Но если это так, возникает проблема с возвратом из подменю в главное меню.

Или другой пример. Первая панель программы - это страница входа в систему, а следующая страница зависит от введенного логина.

Как мне организовать много панелей? Любая помощь будет оценена :)


person damian    schedule 29.01.2013    source источник


Ответы (2)


Если ваш проект не слишком велик, я бы посоветовал создать класс Presenter, который бы контролировал этап и ход программы и отображал один из многих View классов.

Это пример класса презентатора:

class Presenter {

public void showA(Stage mainStage){
    ViewA a = new ViewA();
    a.setOnBackButton(new ViewCallback(){
        public void call(){
            showB();
        }
    });
    mainStage.setScene(new Scene(a));
}

public void showB(Stage mainStage){
    ViewB b = new ViewB();
    b.setOnBackButton(new ViewCallback(){
        public void call(){
            showA();
        }
    });
    mainStage.setScene(new Scene(b));
}

}

Это пример view тела:

public class ViewA {

private ViewCallBack onBackButton = null;

public void setOnBackButton(ViewCallback callback){ onBackButton = callback; }

public void callBack() { if (onBackButton != null) onBackButton.call(); }

...

// somewhere in your code
Button b = new Button("shoot me!");
b.setOnAction(new EventHandler<ActionEvent>(){
    public void handle(ActionEvent event){
        callBack();
    }
});

}

Это ViewCallback интерфейс

public Interface ViewCallback {
    public void call();
}

Вы можете использовать этот простой интерфейс обратного вызова или Callback<P,R> общий интерфейс обратного вызова JavFX .

person drzymala    schedule 09.02.2013

Если вы используете fxml, вы можете создать отдельный файл fxml и связанный класс контроллера для каждой панели. Это отделит представление от логики внутри панели и отделит представление и логику каждой панели от любой другой панели.

Уловка тогда становится тогда, когда вам нужно фактически обмениваться данными между панелями - например, форма изменения пользователя должна быть проинформирована о том, что пользователь должен быть изменен. В этом случае вам нужна какая-то контекстная информация. Это можно сделать разными способами:

  1. Используйте глобальное хранилище (аналогично HTTP-сеансу сервера).
  2. Интеграция инфраструктуры внедрения зависимостей например, Guice, Spring или CDI.
  3. Создайте службы управления, которые контролируют передачу данные между панелями.
  4. Используйте систему стиля шины событий для обмена данными.
  5. Реализуйте свое приложение как веб-приложение в стиле html с состоянием, управляемым сервером.
  6. Используйте фреймворк, подобный ныне (к сожалению) несуществующему jfxflow.

Для простых приложений я бы выбрал - «Создать службы управления, управляющие передачей данных между панелями», используя следующие простые проект как шаблон. Шаблон проекта - это программа, в которой «Первая панель программы - это страница входа в систему, а следующая страница зависит от введенного имени входа».

Если вы используете простую Java и не используете fxml, вы можете посмотреть, как организованы некоторые другие проекты Java, которые не используют fxml, и организовать ваши проекты аналогичным образом. Например, JavaFX Ensemble App, браузер ивы и приложение JavaFX Henley Sales Data (которое можно загрузить как часть того же пакета образцов кода как приложение Ensemble). Обзор исходного кода Ensemble, вероятно, хорошее место для начала.

person jewelsea    schedule 29.01.2013
comment
Обновлен ответ, чтобы указать некоторые примеры приложений, которые используют только java-код и разделены на несколько панелей. - person jewelsea; 30.01.2013