Использование пользовательских классов в FXML без пакетов

#javafx #fxml

#javafx #fxml

Вопрос:

Есть несколько других вопросов по этой теме, но все они используют файлы, размещенные в пакетах, в отличие от моих. У меня есть три простых файла:

  1. FXMLtest.java — Расширение основного класса Application
  2. Bean.java — расширяется Circle . Имеет дополнительное свойство, которое соответствует соглашениям Java bean
  3. view2.fxml

(все файлы находятся в одной папке)
Я делаю вывод (из stackrace), что ошибка возникает из-за того, что FXMLLoader не удается найти Bean , что находится на графике сцены view2.fxml . Возможно, это как-то связано с неиспользованием пакета. Если это так, я просто хотел бы знать, зачем нужны пакеты. Ниже приведены три файла и трассировка стека.

 import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
public class FXMLtest extends Application
{
    @Override
    public void start(Stage stage) throws Exception
    {
        Scene scene = new Scene(FXMLLoader.load(getClass().getResource("view2.fxml")), 300,100);
        stage.setTitle("JavaFX Example");
        stage.setScene(scene);
        stage.show();
    }
    public static void main (String[] args){
        launch(args);
    }
}
 
 import javafx.scene.control.Button;
import javafx.beans.property.SimpleDoubleProperty;
public class Bean extends Button{
    private SimpleDoubleProperty foo;
    Bean(){
        super();
    }
    void setFoo(double x){
        foo.set(x);
    }
    double getFoo(){
        return foo.get();
    }
    SimpleDoubleProperty fooProperty(){
        return foo;
    }
}
 
 <?import javafx.scene.layout.Pane?>
<?import javafx.scene.control.Button?>
<?import Bean?>
<Pane prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" >
   <children>
      <Button text="testButton" />
      <Bean foo="4.4" text="button2" />
   </children>
</Pane>
 
 Exception in Application start method
Exception in thread "JavaFX BlueJ Helper" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException: 
/C:/java/view2.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2848)
    at javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2692)
    at javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2661)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2517)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at FXMLtest.start(FXMLtest.java:10)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(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$148(WinApplication.java:191)
    ... 1 more
Caused by: java.lang.ClassNotFoundException
    at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2899)
    at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2846)
    ... 20 more
 

Комментарии:

1. Использование пакета по умолчанию в Java вообще не рекомендуется. Почему бы просто не поместить классы в пакеты, как обычно?

2. Я использую BlueJ. Я не уверен, какую структуру пакета использовать, и есть только 3 файла. Я пытался поместить классы в пакет, но все равно были ошибки.

3. Просто поместите все три в именованный пакет. Следуйте соглашениям об именовании пакетов Java