简体   繁体   中英

JavaFx “BorderPane is not a valid type.”

I'm having this error while following a tutorial:


    javafx.fxml.LoadException: BorderPane is not a valid type.
/C:/Users/Eduardo%20Abreu/Documents/Eclipse-Workspace/UnifacsProjeto/bin/projeto/resources/RootLayout.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597)
    at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2774)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2704)
    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 projeto.MainApp.initRootLayout(MainApp.java:33)
    at projeto.MainApp.start(MainApp.java:24)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: 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$154(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at projeto.MainApp.showFilmeOverview(MainApp.java:48)
    at projeto.MainApp.start(MainApp.java:26)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
    ... 1 more
Exception running application projeto.MainApp

Here's my code:


package projeto;


import java.io.IOException;

import ch.makery.address.MainApp;
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("CineTudo");

        initRootLayout();

        showFilmeOverview();
    }

    public void initRootLayout(){
        try {
            //Carrega o layout root do arquivo fxml
            FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("resources/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();
            Scene cena = new Scene(rootLayout);
            primaryStage.setScene(cena);
            primaryStage.show();

        } catch(IOException e) {
            e.printStackTrace();

       }
      }
        public void showFilmeOverview() {       
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation((MainApp.class.getResource("resources/FilmeOverview.fxml")));
            AnchorPane filmeOverview = (AnchorPane) loader.load();
            rootLayout.setCenter(filmeOverview);
        }catch (IOException e){

            e.printStackTrace();
        }

        }
public Stage getPrimaryStage() {
            return primaryStage;
        }


public static void main(String[] args) {

    launch(args);
}
}

Here's the tutorial code:

package ch.makery.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);
    }
}

I don't have any id's on the Fxml file and the tutorial's one doesn't have it either, i created FilmeOverview.fxml as AnchorPane and RootLayout as BorderPane, I tried changing the position of the method but it doesn't work, does anyone know how to fix this?

Edit: Here's the FXML file:

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

<?import com.jfoenix.controls.JFXButton?>
<?import javafx.geometry.Insets?>
<?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?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="500.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <SplitPane dividerPositions="0.29797979797979796" layoutX="191.0" layoutY="120.0" prefHeight="400.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="-25.0" layoutY="46.0" prefHeight="398.0" prefWidth="175.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                    <columns>
                      <TableColumn prefWidth="75.0" text="Filme" />
                      <TableColumn prefWidth="75.0" text="Sala" />
                        <TableColumn prefWidth="75.0" text="Categoria" />
                    </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="14.0" layoutY="14.0" text="Detalhes do Filme">
                     <font>
                        <Font name="Open Sans Light" size="15.0" />
                     </font>
                  </Label>
                  <GridPane layoutX="14.0" layoutY="49.0" prefHeight="268.0" prefWidth="547.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="49.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 minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Label text="Título:">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label layoutX="20.0" layoutY="17.0" text="Sala:" GridPane.rowIndex="1">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label layoutX="20.0" layoutY="55.0" text="Categoria:" GridPane.rowIndex="2">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Diretor:" GridPane.rowIndex="3">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Duração:" GridPane.rowIndex="4">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Protagonista:" GridPane.rowIndex="5">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Classificação:" GridPane.rowIndex="6">
                           <font>
                              <Font size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1">
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="1">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="2">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="3">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="4">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="5">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                        <Label text="Label" GridPane.columnIndex="1" GridPane.rowIndex="6">
                           <font>
                              <Font name="Roboto" size="16.0" />
                           </font>
                           <GridPane.margin>
                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
                           </GridPane.margin>
                        </Label>
                     </children>
                  </GridPane>
                  <ButtonBar layoutX="276.0" layoutY="425.0" prefHeight="59.0" prefWidth="267.0">
                     <buttons>
                        <JFXButton style="-fx-background-color: #00BCD4;" text="Adicionar" />
                        <JFXButton style="-fx-background-color: #03A9F4;" text="Editar" />
                        <JFXButton style="-fx-background-color: #F44336;" text="Deletar" />
                     </buttons>
                  </ButtonBar>
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>

Edit 2: Here's rootLayout.fxml:

<?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.AnchorPane?>

<BorderPane prefHeight="500.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <MenuBar layoutY="2.0" prefHeight="25.0" prefWidth="800.0">
        <menus>
          <Menu mnemonicParsing="false" text="Arquivo">
            <items>
              <MenuItem mnemonicParsing="false" text="Fechar" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Editar">
            <items>
              <MenuItem mnemonicParsing="false" text="Deletar" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Ajuda">
            <items>
              <MenuItem mnemonicParsing="false" text="Sobre" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </children>
</AnchorPane>

This is not a duplicate, changing the import doesn't fix it, i still get

Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[31,3]

You have a couple of issues:

  1. The FXML doesn't have an import statement for javafx.scene.layout.BorderPane .
  2. Your rootLayout.fxml file is invalid FXML. You close the BorderPane element with an AnchorPane tag.
  3. You define the contents of the border pane as children, where they are supposed to be defined by position.

Sample valid FXML with the above issues fixed:

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

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane prefHeight="500.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
    <top>
        <MenuBar layoutY="2.0" prefHeight="25.0" prefWidth="800.0">
            <menus>
                <Menu mnemonicParsing="false" text="Arquivo">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Fechar" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Editar">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Deletar" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Ajuda">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Sobre" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>
    </top>
</BorderPane>

As an aside, I recommend downloading Gluon SceneBuilder and using that to edit your FXML.

Also note, some IDEs, such as IntelliJ , include code completion, type checking and syntax checking which would highlight many of the above errors in your document when you load the file into the IDE.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM