Как отправить и применить текст от метки одного контроллера к метке в другом контроллере? - PullRequest
0 голосов
/ 25 декабря 2018

Я делаю приложение с помощью JavaFX и Scene Builder.

У меня есть два контроллера: Controller и FontController

У меня есть основной класс, который запускает мою программу и открывает Stage с первым fontroller (Контроллер)

public class Main extends Application {


public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
try {

  Parent root = FXMLLoader.load(getClass().getResource("/card/card.fxml"));
  Scene scene = new Scene(root, 1600, 600);
  primaryStage.setScene(scene);
  scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
  primaryStage.initStyle(StageStyle.UNDECORATED);
  primaryStage.setMaximized(true);
  primaryStage.setResizable(true);


  primaryStage.getIcons().add(new Image("card/resources/logo-icon.png"));
  primaryStage.show();

    //adding resize and drag primary stage
    ResizeHelper.addResizeListener(primaryStage);



  //assign ALT+ENTER to maximize window
  final KeyCombination kb = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.CONTROL_DOWN);
  scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
      if (kb.match(event)) {
        primaryStage.setMaximized(!primaryStage.isMaximized());
        primaryStage.setResizable(true);

      }
    }
  });

} catch (Exception e) {
  e.printStackTrace();
}

}

}

В контроллере есть метка и кнопка.Когда я нажимаю на кнопку, вызывается метод и появляется новое окно со вторым контроллером (FontController):

@FXML private Button btnFont;
@FXML  private Label category1
@FXML
 void changeFont(ActionEvent event) {
   try {
  FXMLLoader fxmlLoader = new 
FXMLLoader(getClass().getResource("font.fxml"));
  Parent rootFont = (Parent) fxmlLoader.load();
  Stage stage = new Stage();
  stage.setTitle("Select Font");
  stage.setScene(new Scene(rootFont));
  stage.show();    

} catch (Exception e) {
  System.out.println("can't load new window");
}

}

В FontCOntroller есть кнопка «ОК» и метка:

@FXML  private Label fontLabel;
@FXML  private Button btnFontOk;

Скажите, пожалуйста, что мне следует делать, чтобы отправлять и применять текст с метки в FontController, когда я нажимаю кнопку «ОК» для метки в контроллере?

Controller

FontController

1 Ответ

0 голосов
/ 25 декабря 2018

РЕШЕНИЕ НАЙДЕНО:

Я создал класс "Context" в каталоге моего проекта, чтобы все контроллеры связывались друг с другом.Вы можете добавить столько контроллеров, сколько захотите.

Здесь это выглядит так:

package card;


public class Context {
  private final static Context instance = new Context();
  public static Context getInstance() {
    return instance;
  }

  private Controller controller;
  public void setController(Controller controller) {
    this.controller=controller;
  }

  public Controller getController() {
    return controller;
  }

  private FontController fontController;
  public void setFontController(FontController fontController) {
    this.fontController=fontController;
  }

  public FontController getFontController() {
    return fontController;
  }
}

Контроллер:

Я создал геттеры и сеттеры (ALT + Вставить вIDEA) для метки, которую я хочу изменить

public Label getCategory1() {
    return category1;
  }

  public void setCategory1(Label category1) {
    this.category1 = category1;
  }

Чтобы получить переменные и методы FontController через класс Context, я поместил строку кода

//getting FontController through Context Class
  FontController fontCont = Context.getInstance().getFontController();

Я зарегистрировал Controller в классе Context через мой метод initialize(мой класс реализует Initializable)

@FXML
  public void initialize(URL location, ResourceBundle resources) {

    //register Controller in  Context Class
    Context.getInstance().setController(this);

  }

FontController:

, чтобы получить переменные и методы контроллера, я поместил этот код:

//getting Controller variables and methods through Context class
  Controller cont = Context.getInstance().getController();

Я также зарегистрировал FontController в классе Context с помощью метода initialize:

@Override
  public void initialize(URL location, ResourceBundle resources) {

    //register FontController in  Context Class
    Context.getInstance().setFontController(this);
}

Метод, который отправляет текст и цвет текста из метки в этом FontController для метки в Controller при нажатии на кнопку:

@FXML
  void applyFont(ActionEvent event) {
    cont.getCategory1().setText(fontLabel.getText());
    cont.getCategory1().setTextFill(fontLabel.getTextFill());
  }

* Создав класс Context, вы можете заставить контроллеры связываться друг с другом и создавать столько контроллеров, сколько вам нужно.Контроллеры видят переменные и методы друг друга

...