LoadException при попытке загрузить новое окно fxml - PullRequest
0 голосов
/ 10 мая 2019

У меня есть меню javafx, я хочу перейти в другое окно.Когда я использовал Java-8, все работало, но теперь я переключился на javafx-11 и java-11 и не могу переключиться.Код переключения

AnchorPane pane = FXMLLoader.load(getClass().getResource("/main/main.fxml"), resources);

Я искал Интернет и stackoverflow и попытался выполнить следующее. 1. В идее Inteliij я добавил все модули и библиотеки и применил изменения в структуре проекта.2. Я добавил в пакет src module-info.java 3. Я проверил, не содержит ли fxml, который я пытаюсь загрузить, какие-либо ошибки или unsed идентификаторы.4. Я проверил имена контроллеров и fxmls, которые я пытаюсь загрузить

Код модуля-info.java

module duno {
    requires javafx.fxml;
    requires javafx.controls;
    requires java.logging;
    requires javafx.web;

    opens main;
}

Код метода из контроллера, который я вызываю, чтобы получитьОкно настроек

    @FXML
    void goto_settings(ActionEvent event) {
        try {
            ResourceBundle resources;
            switch(settings.getLanguage().get(settings.getSelectedLanguage())) {
                case "Czech":
                    resources = ResourceBundle.getBundle("/bundles/LangBundle_cz");
                    break;
                default:
                    resources = ResourceBundle.getBundle("/bundles/LangBundle_en");

            }
            AnchorPane pane = load(getClass().getResource("/settings/settings.fxml"), resources);

            rootpane.getChildren().setAll(pane);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Настройки контроллера

package settings;


import duno.Serialization;
import duno.Settings;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.AnchorPane;
import javafx.stage.DirectoryChooser;
import main.Main;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * FXML Controller class
 *
 * @author Filip
 */
public class SettingsController implements Initializable {

    @FXML
    private AnchorPane rootpane;

    @FXML
    private ComboBox<String> adf_combobox;

    @FXML
    private ComboBox<String> pf_combobox;

    @FXML
    private CheckBox del_checkbox;

    @FXML
    private ComboBox<String> language_combobox;

    private Settings settings;
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        /*
            Load old settings or create new if settings file doesnt exist
        */
        Serialization ser = new Serialization();
        String fileName = ser.getFolder() + "settings" + ser.getExt();
        File f = new File(fileName);
        if(f.exists() && !f.isDirectory()) {
            try {
                Settings oldSettings = (Settings) ser.deserialize("settings");
                settings = oldSettings;
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            settings = new Settings();
        }
        /*
         Setup the GUI
        */
        adf_combobox.getItems().addAll(settings.getActiveDownloadFolder());
        adf_combobox.getSelectionModel().select(settings.getSelectedActiveDownloadFolder());
        pf_combobox.getItems().addAll(settings.getPreferredFormat());
        pf_combobox.getSelectionModel().select(settings.getSelectedPreferredFormat());
        del_checkbox.setSelected(settings.isDownloadEntireList());
        language_combobox.getItems().addAll(settings.getLanguage());
        language_combobox.getSelectionModel().select(settings.getSelectedLanguage());
    }

    @FXML
    void addNewDownloadFolder(ActionEvent event) {
        DirectoryChooser directoryChooser = new DirectoryChooser();
        File selectedDirectory = directoryChooser.showDialog(rootpane.getScene().getWindow());

        if(selectedDirectory == null){
            // Nothing was selected
        } else{
            settings.addActiveDownloadFolder(selectedDirectory.getAbsolutePath());
            System.out.println(settings.getActiveDownloadFolder().toString());
            adf_combobox.getItems().setAll(settings.getActiveDownloadFolder());
        }
    }

    @FXML
    void removeSelectedDownloadFolder(ActionEvent event) {
        if(adf_combobox.getItems().size() <= 1) {
            Alert alert = new Alert(Alert.AlertType.WARNING);
            alert.setTitle("Warning Dialog");
            alert.setHeaderText("You can´t remove this download folder");
            alert.setContentText("You can´t remove all download folders");

            alert.showAndWait();
        } else {
            int item = adf_combobox.getSelectionModel().getSelectedIndex();
            settings.removeActiveDownloadFolder(item);
            adf_combobox.getItems().setAll(settings.getActiveDownloadFolder());
            adf_combobox.getSelectionModel().selectFirst();
        }

    }

    @FXML
    void saveSettings(ActionEvent event) {
        settings.setSelectedActiveDownloadFolder(adf_combobox.getSelectionModel().getSelectedIndex());
        settings.setSelectedPreferredFormat(pf_combobox.getSelectionModel().getSelectedIndex());
        settings.setDownloadEntireList(del_checkbox.isSelected());
        settings.setSelectedLanguage(language_combobox.getSelectionModel().getSelectedIndex());
        System.out.println(settings.getLanguage().get(settings.getSelectedLanguage()));

        Serialization ser = new Serialization();
        String fileName = ser.getFolder() + "settings" + ser.getExt();
        File f = new File(fileName);
        if(f.delete()) {
            System.out.println("File deleted");
            ser.serialize(settings, "settings");
        } else {
            System.out.println("Settings file not deleted");
        }

    }

    @FXML
    void gotoDownloads(ActionEvent event) {
        try {
            ResourceBundle resources;
            switch(settings.getLanguage().get(settings.getSelectedLanguage())) {
                case "Czech":
                    resources = ResourceBundle.getBundle("bundles/LangBundle_cz");
                    break;
                default:
                    resources = ResourceBundle.getBundle("bundles/LangBundle_en");

            }
            AnchorPane pane = FXMLLoader.load(getClass().getResource("/main/main.fxml"), resources);
            rootpane.getChildren().setAll(pane);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}


Настройки fxml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>

<AnchorPane id="AnchorPane" fx:id="rootpane" minHeight="800.0" minWidth="1000.0" prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="settings.SettingsController">
    <children>
      <GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
              <MenuBar>
                  <menus>
                      <Menu mnemonicParsing="false" onAction="#gotoDownloads" text="Download">
                          <items>
                              <MenuItem mnemonicParsing="false" onAction="#gotoDownloads" text="Download" />
                          </items>
                      </Menu>
                      <Menu mnemonicParsing="false" text="Settings">
                          <items>
                              <MenuItem mnemonicParsing="false" text="Settings" />
                          </items>
                      </Menu>
                  </menus>
              </MenuBar>
              <GridPane GridPane.rowIndex="1">
                  <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" maxWidth="443.79998779296875" minWidth="10.0" prefWidth="272.8000244140625" />
                      <ColumnConstraints hgrow="SOMETIMES" maxWidth="561.4000396728516" minWidth="10.0" prefWidth="303.1999755859375" />
                      <ColumnConstraints hgrow="SOMETIMES" maxWidth="737.199951171875" minWidth="10.0" prefWidth="289.60002441406255" />
                  <ColumnConstraints hgrow="SOMETIMES" maxWidth="575.4000244140625" minWidth="10.0" prefWidth="121.20002441406245" />
                  </columnConstraints>
                  <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" />
                  <RowConstraints minHeight="10.0" prefHeight="30.0" />
                  </rowConstraints>
                  <children>
                      <Label text="%active_download_folder_text" />
                      <ComboBox fx:id="adf_combobox" prefHeight="26.0" prefWidth="294.0" GridPane.columnIndex="1" />
                      <HBox prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="2">
                          <children>
                              <Button mnemonicParsing="false" onAction="#addNewDownloadFolder" text="%add_new_active_download_folder_button_text" />
                              <Button mnemonicParsing="false" onAction="#removeSelectedDownloadFolder" text="%remove_selected_active_download_folder_button_text" />
                          </children>
                          <padding>
                              <Insets top="5.0" />
                          </padding>
                      </HBox>
                      <Label text="%preferred_format_text" GridPane.rowIndex="1" />
                      <ComboBox fx:id="pf_combobox" prefHeight="26.0" prefWidth="114.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                      <HBox prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
                          <opaqueInsets>
                              <Insets top="5.0" />
                          </opaqueInsets>
                          <padding>
                              <Insets top="5.0" />
                          </padding>
                      </HBox>
                      <Label text="%always_download_entire_list_text" GridPane.rowIndex="2" />
                      <CheckBox fx:id="del_checkbox" mnemonicParsing="false" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                      <Label text="%language_text" GridPane.rowIndex="3" />
                      <ComboBox fx:id="language_combobox" prefHeight="26.0" prefWidth="162.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                      <HBox prefHeight="100.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="3">
                          <padding>
                              <Insets top="5.0" />
                          </padding>
                      </HBox>
                  <Button mnemonicParsing="false" onAction="#saveSettings" text="%save_button_text" GridPane.columnIndex="3" GridPane.rowIndex="4" />
                  </children>
                  <padding>
                      <Insets left="20.0" top="10.0" />
                  </padding>
              </GridPane>
         </children>
      </GridPane>
    </children>
</AnchorPane>

Оно должно загрузить окно настроек, как это было в java-8, но теперь я получил иerror Run log

"C:\Program Files\Java\jdk-11.0.3\bin\java.exe" --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1.1\lib\idea_rt.jar=50856:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1.1\bin" -Dfile.encoding=UTF-8 -p C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.graphics.jar;E:\duno\out\production\duno;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx-swt.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.controls.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.fxml.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.media.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.swing.jar;C:\Users\Filip\Documents\javafx-sdk-11.0.2\lib\javafx.web.jar -m duno/main.Main
English
kvě 10, 2019 10:57:10 DOP. main.Controller goto_settings
SEVERE: null
javafx.fxml.LoadException: 
/E:/duno/out/production/duno/settings/settings.fxml:17

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
    at javafx.fxml/javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:105)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:943)
    at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
    at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
    at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3128)
    at duno/main.Controller.goto_settings(Controller.java:184)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
    at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
    at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
    at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1782)
    at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.controls/javafx.scene.control.MenuItem.fire(MenuItem.java:465)
    at javafx.controls/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1380)
    at javafx.controls/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(ContextMenuContent.java:1333)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3851)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class javafx.fxml.FXMLLoader$ValueElement (in module javafx.fxml) cannot access class settings.SettingsController (in module duno) because module duno does not export settings to module javafx.fxml
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
    at java.base/jdk.internal.reflect.Reflection.ensureMemberAccess(Reflection.java:99)
    at java.base/java.lang.Class.newInstance(Class.java:579)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:936)
    ... 66 more


Не обращайте внимания на английский в выводе, это просто язык, используемый в приложении

1 Ответ

0 голосов
/ 10 мая 2019

Я понял это самостоятельно.Вот как я поступил.Я читаю ошибку несколько раз, а потом мне хоть что-то нужно экспортировать.Итак, я обнаружил, что информация модуля экспортирует что-то во что-то.Поэтому я добавил настройки экспорта в javafx.fxml.Другая проблема в том, что я не смог получить доступ к настройкам, потому что корневая панель была закрытой, а настройки не были открыты.Поэтому я попытался открыть настройки;и это работает:)

Так вот окончательная версия

module duno {
requires javafx.fxml;
requires javafx.controls;
requires java.logging;
requires javafx.web;
exports settings to javafx.fxml;

opens main;
opens settings;

}

Я надеюсь, что это поможет кому-то в будущем с той же ошибкой

...