FXML加载问题

时间:2016-03-28 13:36:53

标签: java javafx fxml

学习fxml的工作原理。

java tutorial后,我写了一个简单的程序,似乎不会加载我的fxml文件。

由于无法加载,我认为我的GridPane设置存在问题。根据该教程的第6-3节,我认为这是正确的。

我也遵循了这个answer的建议并运行了这个fxml文档,我没有收到任何错误,并且出现了一个白色的无格式框。我尝试将xmlns:fx变量调整为http://javafx.com/fxml/1,但它没有改变结果。

错误

C:\Users\rbenedict\Documents\Java Modules>java -cp .;fxmltut fxmltut.FXMLEx
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unk
nown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Sou
rce)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(
Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
/C:/Users/rbenedict/Documents/Java%20Modules/fxmltut/FXMLDoc.fxml

        at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
        at javafx.fxml.FXMLLoader.importClass(Unknown Source)
        at javafx.fxml.FXMLLoader.processImport(Unknown Source)
        at javafx.fxml.FXMLLoader.processProcessingInstruction(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at fxmltut.FXMLEx.start(FXMLEx.java:24)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162
(Unknown Source)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown
 Source)
        at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Sourc
e)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown S
ource)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
        ... 1 more
Caused by: java.lang.ClassNotFoundException
        at javafx.fxml.FXMLLoader.loadType(Unknown Source)
        ... 16 more
Exception running application fxmltut.FXMLEx

FXMLEx.java

package fxmltut;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javafx.scene.Parent;
import java.lang.Class;

import javafx.fxml.FXMLLoader;

public class FXMLEx extends Application {

    @Override
    public void start(Stage stage) throws Exception {


        FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDoc.fxml"));
        if(loader == null) {
            System.out.println("Can't find fxml!");
            System.exit(1); 

        }
        Parent root = loader.load();
        Scene scene = new Scene(root, 300,275);

        stage.setTitle("FXML Welcome");
        stage.setScene(scene);
        stage.show();

    }

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

}

FXMLCont

package fxmltut;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class FXMLCont {
    @FXML private Text actTarg;
    @FXML protected void handleSubmitButtonAction(ActionEvent event) {
        actTarg.setText("Sign in button pressed");
    }
}

FXMLDoc.fxml

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

<?import fxmltut.*?>
<?import java.net.*?>
<?import java.geometry.*?>
<?import java.scene.control*?>
<?import java.scene.layout.*?>
<?import java.scene.text.*?>

<GridPane fx:controller="fxmltut.FXMLCont"

    xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <padding><Insets top="25" right="25" bottom="25" left="25"/></padding>

   <!--

    <Text text="Welcome"
        GridPane.columnIndex="0" GridPane.rowIndex="0"
        GridPane.columnSpan="2"/>

    <Label text="User Name:"
        GridPane.columnIndex="0" GridPane.rowIndex="1"/>
    <TextField
        GridPane.columnIndex="1" GridPane.rowIndex="1"/>

    <Label text="Password:"
        GridPane.columnIndex="0" GridPane.rowIndex="2"/>

    <PasswordField fx:id="pw" GridPane.columnIndex="1" GridPane.rowIndex="2"/>

    <HBox spacing="10" alignment = "bottom_right"
        GridPane.columnIndex="1" GridPane.rowIndex="4">

        <Button text="Sign in"
        onAction="#handleSubmitButtonAction"/>

    </HBox>

    <Text fx:id="actTarg"
        GridPane.columnIndex="0" GridPane.columnSpan="2"
        GridPane.halignment="RIGHT" GridPane.rowIndex="6" />
    -->
</GridPane>

使用FXML

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

<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="377.0" prefWidth="533.0" 
xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="fxmltut.FXMLCont">

</GridPane>

修改

Woops,忘记在粘贴fxml内容时缩进import语句。使线条消失。奇怪。

2 个答案:

答案 0 :(得分:1)

是的,如果您的FXML肯定在类路径上且有效,那么您应该没问题,但看起来它缺少导入语句。在FXMLLoader null检查之前,您还应该检查您的资源是否为null。您也许可以使用静态FXMLLoader.load方法而不是实例化FXMLLoader对象。或者至少是一个try-catch块。

编辑:既然你修改了你的import语句,他们指的是java等,而不是javafx。应该是这样......

#!/usr/bin/env python2
# coding=utf-8

import tornado
import time
from nsq.writer import Writer

w = Writer(["bj1:4150", "bj2:4150"], reconnect_interval=15)
w.connect()


@tornado.gen.coroutine
def future_pub(topic, msg):
    result = w.pub(topic, msg)
    print(result)
    time.sleep(3)
    raise tornado.gen.Return(result)


@tornado.gen.coroutine
def main():
    while True:
        try:
            future = future_pub("test", "message")
            yield future
        except Exception as e:
            print(e.message)


tornado.ioloop.IOLoop.instance().run_sync(main)

答案 1 :(得分:1)

FXML文件中的导入不正确:

<?import java.geometry.*?>
<?import java.scene.control*?>
<?import java.scene.layout.*?>
<?import java.scene.text.*?>

成为

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>