Значение FXML Label не загружается при открытии нового окна - PullRequest
0 голосов
/ 04 января 2019

Когда я хочу открыть новое окно для события щелчка, мне нужно загрузить некоторое значение в метку, но значение не обновляется.Я попытался загрузить новое окно, создать экземпляр метки и установить значение для отображения, но ничего не происходит.Сильфон - это текст и код:

public class PetshopController implements Initializable {
@FXML
    public ListView<String> ListaProgramari;
@FXML
    public void completeTheAppointment(MouseEvent e) {
        try {
            String animalName = ListaProgramari.getSelectionModel().getSelectedItem();
            DiagnosticController dc = new DiagnosticController();
            dc.openDiagnosticWindow(animalName);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

public class DiagnosticController implements Initializable{

    @FXML
    private Label animalName = new Label();
    @FXML
    public TextField newDiagnostic;
    @FXML
    public Pane AnimalDetails;
    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    public void openDiagnosticWindow(String animalLabel) {
        try {
            animalName = new Label();
            animalName.setText(animalLabel);
            BorderPane root = (BorderPane) FXMLLoader.load(getClass().getResource("/controller/Diagnostic.fxml"));
            Scene scene = new Scene(root, 600, 400);
            scene.getStylesheets().add(getClass().getResource("/controller/application.css").toExternalForm());
            Stage stage = new Stage();
            stage.setScene(scene);
            stage.show();           

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

Сильфон - это FXML.Он содержит все элементы из нового окна, которое открывается, проблема в ярлыке: "animalName":

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane prefHeight="303.0" prefWidth="452.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.DiagnosticController">
   <top>
      <MenuBar prefHeight="0.0" prefWidth="480.0" BorderPane.alignment="CENTER" />
   </top>
   <center>
      <SplitPane dividerPositions="0.6445182724252492" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0" BorderPane.alignment="CENTER">
        <items>
          <AnchorPane fx:id="AnimalDetails" minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
               <children>
                  <TextField fx:id="newDiagnostic" layoutX="190.0" layoutY="131.0" />
                  <Label layoutX="48.0" layoutY="135.0" prefHeight="17.0" prefWidth="120.0" text="Adauga Diagnostic" />
                  <Label layoutX="42.0" layoutY="75.0" prefHeight="17.0" prefWidth="120.0" text="Numele Animalului:" />
                  <Label fx:id="animalName" layoutX="189.0" layoutY="75.0" prefHeight="17.0" prefWidth="145.0" text="empty" />
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="49.0" prefWidth="450.0">
               <children>
                  <Button fx:id="completeConsultation" layoutX="172.0" layoutY="46.0" mnemonicParsing="false" onMouseClicked="#completeConsultation" prefHeight="36.0" prefWidth="79.0" text="Complete" />
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </center>
</BorderPane>

1 Ответ

0 голосов
/ 04 января 2019

Делая @FXML private Label animalName = new Label();, вы создаете новую метку вместо уже созданной fxml.Фактически, вы делаете это дважды: эта метка снова инициализируется в openDiagnosticWindow на animalName = new Label();Просто используйте @FXML public Label animalName;

Другая проблема заключается в этих строках:

 DiagnosticController dc = new DiagnosticController();
 dc.openDiagnosticWindow(animalName); 

dc - это ссылка на экземпляр DiagnosticController, но не экземпляр, используемый fxml.

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

FXMLLoader loader = new FXMLLoader();
BorderPane root =  loader.load(getClass().getResource("/controller/Diagnostic.fxml")                                                                                .openStream());
DiagnosticController dc = (DiagnosticController)loader.getController();

, что означает, что загрузка Diagnostic.fxml должна быть сделана с помощью PetshopControllerа не DiagnosticController.

Для получения дополнительной помощи, пожалуйста, напишите mcve .Отсутствует важная информация (например, как называется опубликованный файл fxml? Что вызывает PetshopController? И более), что заставляет нас догадываться.

...