Как подключить fxml файл к коду javafx?

635
05 февраля 2017, 12:10

Здравствуйте, что-то совсем запутался с fxml. У меня есть два Java-класса. Один из них, InterfaceClass, подгружает файл и создает из него узел и сцену. Второй класс - ControllerClass, в отдельном файле, содержит объявления,

@FXML TextField ipField, portField, nameField;
@FXML Label infoLabel;
@FXML Button loginButton, exitButton;

метод initialize и ActionListener у одной из кнопок. В соответствующем поле fxml файла следующее:

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="250.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="guiPck.ControllerClass">

Короче говоря, вроде бы всё правильно прописано. Между собой классы вообще ничем не связываются, выходит? Компилятор даже отказывался компилировать ControllerClass, пока я его импортом к InterfaceClass не привязал.

При компиляции выдает исключение:

Trouble viewing fxml file:javafx.fxml.LoadException: /D:/%d0%ba%d0%be%d0%b4/java/REALSHIT/MyChatGui/bin/guiPck/guiLogin.fxml

Однако если подключить в fxml не ControllerClass, а InterfaceClass, он показывает нарисованное окошко. Очевидно, что в этом случае никакие кнопки не реагируют.

Возможно, нужно класс ControllerClass прямо внутри InterfaceClass писать? Форму строил SceneBuilder-ом, но контроллер прописывал вручную.

InterfaceClass:

package guiPck;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.fxml.*;
import javafx.application.*;
import javafx.event.*;
import javafx.geometry.*;
import java.net.URL;
import java.util.ResourceBundle;
import clientPck.Client;
import guiPck.ControllerClass;
public class InterfaceClass extends Application {
    public static void main(String[] args){
        Application.launch(InterfaceClass.class, (java.lang.String[])null);
    }

    public void start (Stage loginStage){
        try {
            AnchorPane loginNode = (AnchorPane)FXMLLoader.load(InterfaceClass.class.getResource("guiLogin.fxml"));
            Scene loginScene = new Scene(loginNode);
            loginStage.setTitle("Login");
            loginStage.setScene(loginScene);
            loginStage.show();
        } catch (Exception ex){
            System.out.println("Trouble viewing fxml file:"+ex);
            System.exit(-1);
        }   
    }//end of start method
}//end of InterfaceClass

ControllerClass:

package guiPck;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.*;
import javafx.scene.control.*;

public class ControllerClass implements Initializable{
            @FXML TextField ipField, portField, nameField;
            @FXML Label infoLabel;
            @FXML Button loginButton, exitButton;
            public void initialize(URL fxmlFileLocation, ResourceBundle resources){
                System.out.println("HI");
                exitButton.setOnAction((e)-> {
                    infoLabel.setText("he");
                });
            }
}

И fxml файл:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="250.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="guiPck.ControllerClass">
   <children>
      <TextField id="ipField" alignment="CENTER" layoutX="171.0" layoutY="69.0" prefHeight="25.0" prefWidth="158.0" />
      <TextField id="portField" alignment="CENTER" layoutX="171.0" layoutY="100.0" prefHeight="25.0" prefWidth="158.0" text="4444" />
      <Label alignment="CENTER" contentDisplay="CENTER" layoutX="68.0" layoutY="69.0" prefHeight="25.0" prefWidth="80.0" text="Server IP">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <Label alignment="CENTER" contentDisplay="CENTER" layoutX="68.0" layoutY="100.0" prefHeight="25.0" prefWidth="80.0" text="Port">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <TextField id="nameField" alignment="CENTER" layoutX="171.0" layoutY="133.0" prefHeight="25.0" prefWidth="158.0" />
      <Label alignment="CENTER" contentDisplay="CENTER" layoutX="68.0" layoutY="133.0" prefHeight="25.0" prefWidth="80.0" text="Name">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <Button id="loginButton" layoutX="122.0" layoutY="204.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="99.0" text="Login" />
      <Button id="exitButton" layoutX="280.0" layoutY="204.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="99.0" text="Exit" />
      <Label id="infoLabel" alignment="CENTER" contentDisplay="CENTER" layoutX="131.0" layoutY="174.0" prefHeight="17.0" prefWidth="239.0" text="complete the form and press login" />
   </children>
</AnchorPane>
READ ALSO
Как менять текст каждый раз?

Как менять текст каждый раз?

У меня при подгрузке данных с rss во время ожидания выводится текст который прописан в stringsМожно ли составить список фраз которые будут выводится...

427
html теги и атрибуты, jsoup

html теги и атрибуты, jsoup

Добрый вечер! У меня есть html (часть)

526
Создание фейк-класса

Создание фейк-класса

ЗдравствуйтеЕсть класс, X в конструктор надо передать интерфейс

455
Как сделать чтобы в фрагменте не использовался тот же тулбар что и в активити?

Как сделать чтобы в фрагменте не использовался тот же тулбар что и в активити?

У меня одно активити и несколько фрагментов, у всех фрагментах тот же тулбар что и в активвитиКак поменять ?

468