Итак, я кодирую этот чат-клиент для школьного проекта, и теперь мне нужно реализовать GUI с использованием JavaFX. Я создал аккуратный графический интерфейс в Scene Builder. Всякий раз, когда клиент получает сообщение, он должен теперь вызвать метод в контроллере, чтобы добавить восстановленную строку в TextField.IllegalArgumentException при загрузке контроллера из FXML
Однако, когда я пытаюсь загрузить контроллер из FXML-файла я получаю эту ошибку:
null/../../../../img/jim.png
javafx.fxml.LoadException:
unknown path:16
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
at com.example.main.GUI.start(GUI.java:46)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1100)
at javafx.scene.image.Image.<init>(Image.java:681)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:47)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:37)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:763)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532)
... 11 moreCaused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1092)
... 17 more
Вот мой код для получения контроллера и вызова метода в нем:
try {
FXMLLoader loader = new FXMLLoader();
Pane p = loader.load(getClass().getResource("ChatForm.fxml").openStream());
ChatForm chatForm = (ChatForm) loader.getController();
chatForm.test();
} catch (IOException e) {
e.printStackTrace();
}
Наконец, мой файл FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="410.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.main.ChatForm">
<children>
<VBox prefHeight="410.0" prefWidth="300.0">
<children>
<ImageView fitHeight="135.0" fitWidth="300.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@../../../../img/jim.png" />
</image>
</ImageView>
<TextArea fx:id="chatTextArea" editable="false" focusTraversable="false" prefHeight="232.0" prefWidth="300.0" wrapText="true" />
<TextField fx:id="messageTextField" />
<Label text="Skriv ".disconnect" för att logga ut">
<font>
<Font size="10.0" />
</font>
</Label>
</children>
</VBox>
Очевидно, что что-то странное при загрузке логотипа. Есть идеи?
С Новым годом!
Это устранило проблему, и вы правы, она не делает то, что я хотел. Это просто дает мне копию контроллера и не тот экземпляр, который я использую в другом классе, не так ли? Мне нужен тот же экземпляр, чтобы иметь возможность манипулировать TextField в нем. – ProfessorChaos
Да, точно. Поэтому вам просто нужно вызвать 'getController()' таким же образом, когда вы загружаете фактический FXML, который вы показываете, и делаете этот экземпляр контроллера доступным там, где он вам нужен. Это совсем другой вопрос, хотя ... –
Хорошо, Джеймс. Полностью новый для этого. Спасибо за ваше время :) – ProfessorChaos