Squeak.ru - шаблоны программирования

Контроллер JavaFX MVC не работает

Я новичок в javaFX и пытаюсь разработать приложение с помощью MVC. В этом приложении я использую два контроллера, один для menuBar и для panelCenter, которые содержат кнопку и метку. Когда я нажимаю кнопку (CenterControler), «это работает», но когда я нажимаю «Файл-> Выйти» (MainControler), это не работает.

Вот файл Main.java:

package application;
import java.io.IOException;
import controler.CenterControler;
import controler.MainControler;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;

public class Main extends Application {
    CenterControler ctrl_Center;
    MainControler ctrl_Main;
    Stage primaryStage;
    @Override
    public void start(Stage primaryStage) throws IOException {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/themain.fxml"));
    Parent root = (Parent) fxmlLoader.load();
    ctrl_Main = (MainControler)fxmlLoader.getController();
    Scene scene = new Scene(root, 800, 600);
    primaryStage.setTitle("FXML Welcome");
    primaryStage.setScene(scene);
    primaryStage.show();}

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

MainControler.java

package controler;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;

public class MainControler implements Initializable{

    @FXML
    private Menu File;

    @FXML
    private MenuBar barreMenu;

    @FXML
    private Menu sousMenu;

    @FXML
    private MenuItem menuQuit;

    @FXML
    private CenterControler centreControle;


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        assert File != null : "fx:id=\"File\" was not injected: check your FXML file 'themain.fxml'.";
        assert menuQuit != null : "fx:id=\"menuQuit\" was not injected: check your FXML file 'themain.fxml'.";
    }

    public void setCenterControle(CenterControler cc){this.centreControle = cc; }

    @FXML
    protected void onClick2()
    {
        centreControle.show("IT WORKS !!! FROM MAIN CONTROLER");
    }
}

Центрконтроллер.java

package controler;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;

public class CenterControler implements Initializable{

    @FXML
    private AnchorPane monFonds;

    @FXML
    private Button btn_1;

    @FXML
    private Label labelMSG;

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        assert btn_1 != null : "fx:id=\"btn_1\" was not injected: check your FXML file 'part2.fxml'.";
        assert labelMSG != null : "fx:id=\"labelMSG\" was not injected: check your FXML file 'part2.fxml'.";
    }

    public void setBTN(Button btn){ this.btn_1 = btn;}

    public void setLabel(Label lb) {this.labelMSG = lb; }

    public Button getBTN(){ return this.btn_1; }

    public Label getLabel(){ return this.labelMSG;}

    @FXML
    protected void onClickShowMSG()
    {
        labelMSG.setText("PUSH FROM CENTER CONTROLER");
    }

    public void show(String msg)
    {
        labelMSG.setText(msg);
    }
}

themain.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controler.MainControler">
    <children>
        <MenuBar fx:id="barreMenu" VBox.vgrow="NEVER">
           <menus>
                <Menu fx:id="sousMenu" mnemonicParsing="false" text="File">
          <items>
            <MenuItem fx:id="menuQuit" mnemonicParsing="false" onAction="#onClick2" text="Quit" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
        <fx:include fx:id="p2" source="part2.fxml" />
  </children>
</VBox>

часть2.fxml

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controler.CenterControler">
   <children>
      <Button fx:id="btn_1" layoutX="274.0" layoutY="188.0" mnemonicParsing="false" onAction="#onClickShowMSG" text="Button" />
      <Label fx:id="labelMSG" layoutX="286.0" layoutY="128.0" text="Label" />
   </children>
</AnchorPane>

Заранее спасибо.


Ответы:


1

Имя поля, в которое вводится контроллер, создается путем взятия значения атрибута fx:id элемента fx:include и объединения "Controller". Поэтому имя поля, в которое внедряется вложенный контроллер, должно быть p2Controller, а не centreControle:

public class CenterControler implements Initializable {
    //...
    @FXML
    private CenterControler p2Controller;

    //...
}

К сожалению, это плохо документировано... (Мне пришлось посмотреть исходный код, чтобы узнать)

30.10.2015
  • Задокументировано, хотя и очень плохо, здесь. 31.10.2015
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...