2017-08-13 2 views
1

Ich bin neu mit JavaFx und ich verwende Intellij und SceneBuilder. Ich habe ein MVC-Modell erstellt:FXML generiert mit Scenebuilder auf Intellij Idee

Screenshot

PersonOverview und RootLayout mit SceneBuilder erzeugt.

PersonOverview:

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.ButtonBar?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.SplitPane?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.RowConstraints?> 


<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="PersonOverview"> 
    <children> 
     <SplitPane dividerPositions="0.44481605351170567" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <items> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <TableView layoutX="8.0" layoutY="14.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
        <columns> 
         <TableColumn prefWidth="123.0" text="First Name" /> 
         <TableColumn prefWidth="138.0" text="Last Name" /> 
        </columns> 
        <columnResizePolicy> 
         <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 
        </columnResizePolicy> 
        </TableView> 
       </children> 
      </AnchorPane> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
       <children> 
        <Label layoutX="8.0" layoutY="6.0" text="Person details:" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" /> 
        <GridPane layoutX="71.0" layoutY="59.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="30.0"> 
        <columnConstraints> 
         <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
         <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        </columnConstraints> 
        <rowConstraints> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
         <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        </rowConstraints> 
        <children> 
         <Label text="First Name:" /> 
         <Label text="Last Name:" GridPane.rowIndex="1" /> 
         <Label text="Street:" GridPane.rowIndex="2" /> 
         <Label text="City:" GridPane.rowIndex="3" /> 
         <Label text="Postal code:" GridPane.rowIndex="4" /> 
         <Label text="Birthday:" GridPane.rowIndex="5" /> 
         <Label text="Label" GridPane.columnIndex="1" /> 
         <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
         <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
         <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="3" /> 
         <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="4" /> 
         <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="5" /> 
        </children> 
        </GridPane> 
        <ButtonBar layoutX="18.0" layoutY="248.0" prefHeight="40.0" prefWidth="299.0"> 
        <buttons> 
         <Button mnemonicParsing="false" text="New.." /> 
         <Button mnemonicParsing="false" text="Edit.." /> 
         <Button mnemonicParsing="false" text="Delete" /> 
        </buttons> 
        </ButtonBar> 
       </children> 
      </AnchorPane> 
     </items> 
     </SplitPane> 
    </children> 
</AnchorPane> 

RootLayout:

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

<?import javafx.scene.control.Menu?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.MenuItem?> 
<?import javafx.scene.layout.BorderPane?> 


<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="RootLayout"> 
    <top> 
     <MenuBar BorderPane.alignment="CENTER"> 
     <menus> 
      <Menu mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
      </items> 
      </Menu> 
     </menus> 
     </MenuBar> 
    </top> 
</BorderPane> 

MainApp:

package com.fxproject.address; 

import java.io.IOException; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class MainApp extends Application { 

    private Stage primaryStage; 
    private BorderPane rootLayout; 

    @Override 
    public void start(Stage primaryStage) { 
     this.primaryStage = primaryStage; 
     this.primaryStage.setTitle("AddressApp"); 

     initRootLayout(); 

     showPersonOverview(); 
    } 

    /** 
    * Initializes the root layout. 
    */ 
    public void initRootLayout() { 
     try { 
      // Load root layout from fxml file. 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml")); 
      rootLayout = (BorderPane) loader.load(); 

      // Show the scene containing the root layout. 
      Scene scene = new Scene(rootLayout); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Shows the person overview inside the root layout. 
    */ 
    public void showPersonOverview() { 
     try { 
      // Load person overview. 
      FXMLLoader loader = new FXMLLoader(); 
      loader.setLocation(MainApp.class.getResource("view/PersonOverview.fxml")); 
      AnchorPane personOverview = (AnchorPane) loader.load(); 

      // Set person overview into the center of root layout. 
      rootLayout.setCenter(personOverview); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Returns the main stage. 
    * @return 
    */ 
    public Stage getPrimaryStage() { 
     return primaryStage; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Alles sieht gut aus, bis ich versuchen, dieses Programm auszuführen. Es gibt mir diese Fehlerliste:

javafx.fxml.LoadException: /home/ahmed/IdeaProjects/fxproject01/out/production/fxproject01/com/fxproject/address/view/RootLayout.fxml:9 
    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922) 
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971) 
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220) 
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744) 
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) 
    at com.fxproject.address.MainApp.initRootLayout(MainApp.java:35) 
    at com.fxproject.address.MainApp.start(MainApp.java:22) 
    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.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.ClassNotFoundException: RootLayout 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920) 
    ... 18 more 
javafx.fxml.LoadException: /home/ahmed/IdeaProjects/fxproject01/out/production/fxproject01/com/fxproject/address/view/PersonOverview.fxml:15 
    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922) 
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971) 
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220) 
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744) 
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409) 
    at com.fxproject.address.MainApp.showPersonOverview(MainApp.java:54) 
    at com.fxproject.address.MainApp.start(MainApp.java:24) 
    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.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.ClassNotFoundException: PersonOverview 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920) 
    ... 18 more 

Antwort

0

, weil Sie den Controller fx:controller="RootLayout" gesetzt und es ist nicht vorhanden

Sie RootLayoutController Klasse in controller Ordner erstellen und die Klasse Initializable

und dann implementieren machen ändern fx:controller zu

fx:controller="com.fxproject.address.controller.RootLayoutController" 
+0

Was soll ich in diese Klasse legen? Ich hielt es leer und ich habe diesen Fehler: Fehler: (5, 8) java: com.fxproject.address.RootLayoutController ist nicht abstrakt und überschreibt nicht abstrakte Methode initialize (java.net.URL, java.util.ResourceBundle) in javafx.fxml.Initializable – zerocoldTUN

+0

Es ist dein Controller, du stellst den Code ein, der deine Sicht steuert. und natürlich sollten Sie implementieren 'initialize' Methode – Ali

+1

@zerocoldTUN Es gibt keine Notwendigkeit, die' Initializable' Schnittstelle zur Controller-Klasse hinzuzufügen, aber wenn Sie es tun hinzufügen, müssen Sie alle Methoden von der Schnittstelle, die keinen Standard haben implementieren Implementierung, in diesem Fall '@Override public void initialize (URL URL, ResourceBundle Bundle) {} '. BTW: Der Wert des Attributs "fx: controller" ist der vollständig qualifizierte Klassenname der Controller-Klasse. Dieses Attribut ist optional, aber wenn es angegeben wird, muss es eine Klasse mit genau diesem Namen geben (unabhängig von dem Paket, in dem es aufgerufen wird; "Class.forName" wird mit diesem Parameter aufgerufen). – fabian

Verwandte Themen