2015-12-31 4 views
0

Итак, я кодирую этот чат-клиент для школьного проекта, и теперь мне нужно реализовать 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 &quot;.disconnect&quot; för att logga ut"> 
       <font> 
        <Font size="10.0" /> 
       </font> 
      </Label> 
    </children> 
    </VBox> 

Очевидно, что что-то странное при загрузке логотипа. Есть идеи?

С Новым годом!

ответ

2

syntax url="@..." in your FXML file относится к пути относительно текущего местоположения местоположения FXMLLoader.

Однако, когда вы загружаете файл FXML, вы не предоставляете FXMLLoader место, а входной поток. Таким образом, расположение null и (как видно в трассировке стека), ваш путь получает истолковано как

 
null/../../../../img/jim.png 

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

try { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ChatForm.fxml")); 
    Pane p = loader.load(); 
    ChatForm chatForm = (ChatForm) loader.getController(); 
    chatForm.test(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Это исправит непосредственную проблему, предполагая, что путь действительно правильный. Я думаю, что у вас все еще есть другие, по сути, несвязанные проблемы, поскольку вы никогда ничего не делаете с графиком сцены, который вы загружаете (т. Е. Вы никогда не показываете панель p).

+0

Это устранило проблему, и вы правы, она не делает то, что я хотел. Это просто дает мне копию контроллера и не тот экземпляр, который я использую в другом классе, не так ли? Мне нужен тот же экземпляр, чтобы иметь возможность манипулировать TextField в нем. – ProfessorChaos

+0

Да, точно. Поэтому вам просто нужно вызвать 'getController()' таким же образом, когда вы загружаете фактический FXML, который вы показываете, и делаете этот экземпляр контроллера доступным там, где он вам нужен. Это совсем другой вопрос, хотя ... –

+0

Хорошо, Джеймс. Полностью новый для этого. Спасибо за ваше время :) – ProfessorChaos

Смежные вопросы