在Eclipse中部署JavaFX应用程序后,Css无法正常工作

时间:2015-04-11 16:59:39

标签: css eclipse deployment javafx

如果我从Eclipse部署JavaFX应用程序,那么由于某种原因它不会加载CSS文件,尽管应用程序在Eclipse中按预期工作。

主要课程:

public class Main extends Application {

 Stage primaryStage;

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

    showMain();
}

public void showMain(){
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("Mainwindow.fxml"));
        AnchorPane ap = loader.load();
        ap.getStylesheets().add(Main.class.getResource("style.css").toExternalForm());

        Scene scene = new Scene(ap);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

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

css是:

@CHARSET "UTF-8";

.button{
    -fx-background-color: blue;
}

fxml:

<AnchorPane prefHeight="381.0" prefWidth="446.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
   <children>
      <Button layoutX="14.0" layoutY="14.0" mnemonicParsing="false" text="Button" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="14.0" />
   </children>
</AnchorPane>

在build.xml中我只设置了必须的东西。我没有将css转换为bss。我签了这一切。

build.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <project name="JavaFXTester6_Web" default="do-deploy" basedir="."  xmlns:fx="javafx:com.sun.javafx.tools.ant">
     <target name="init-fx-tasks">
        <path id="fxant">
            <filelist>
                <file name="${java.home}\..\lib\ant-javafx.jar"/>
                <file name="${java.home}\lib\jfxrt.jar"/>
            </filelist>
        </path>

        <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
        uri="javafx:com.sun.javafx.tools.ant"
        classpathref="fxant"/>
     </target>
<target name="setup-staging-area">
    <delete dir="externalLibs" />
    <delete dir="project" />
    <delete dir="projectRefs" />

    <mkdir dir="externalLibs" />


    <mkdir dir="project" />
    <copy todir="project">
        <fileset dir="/home/zooey/LinuxEclipse/linuxWorkspace/JavaFXTester6_Web">
            <include name="src/**" />
        </fileset>
    </copy>

    <mkdir dir="projectRefs" />
</target>
<target name='do-compile'>
    <delete dir="build" />
    <mkdir dir="build/src" />
    <mkdir dir="build/libs" />
    <mkdir dir="build/classes" />

    <!-- Copy project-libs references -->
    <copy todir="build/libs">
        <fileset dir="externalLibs">
        </fileset>
    </copy>

    <!-- Copy project references -->

    <!-- Copy project sources itself -->
    <copy todir="build/src">
        <fileset dir="project/src">
            <include name="**/*"/>
        </fileset>
    </copy>

    <javac includeantruntime="false" source="1.8" target="1.8" srcdir="build/src" destdir="build/classes" encoding="UTF-8">
        <classpath>
            <fileset dir="build/libs">
                <include name="*"/>
            </fileset>
        </classpath>
    </javac>

    <!-- Copy over none Java-Files -->
    <copy todir="build/classes">
    <fileset dir="project/src">
        <exclude name="**/*.java"/>
    </fileset>
    </copy>


</target>
<target name="do-deploy" depends="setup-staging-area, do-compile, init-fx-tasks">
    <delete file="dist"/>
    <delete file="deploy" />

    <mkdir dir="dist" />
    <mkdir dir="dist/libs" />

    <copy todir="dist/libs">
        <fileset dir="externalLibs">
            <include name="*" />
        </fileset>
    </copy>


    <fx:resources id="appRes">
        <fx:fileset dir="dist" includes="JavaFXTester6_Web.jar"/>
        <fx:fileset dir="dist" includes="libs/*"/>
    </fx:resources> 

    <fx:application id="fxApplication"
        name="Test"
        mainClass="application.Main"
    />

    <mkdir dir="build/classes/META-INF" />



    <fx:jar destfile="dist/JavaFXTester6_Web.jar">
        <fx:application refid="fxApplication"/>
        <fileset dir="build/classes">
        </fileset>
        <fx:resources refid="appRes"/>

        <manifest>
            <attribute name="Implementation-Vendor" value="ZA"/>
            <attribute name="Implementation-Title" value="Test"/>
            <attribute name="Implementation-Version" value="1.0"/>
            <attribute name="JavaFX-Feature-Proxy" value="None"/>
        </manifest>
    </fx:jar>
    <fx:signjar //intentionally removed >
    <fileset dir='dist'>
            <include name='**/*.jar' />
        </fileset>
    </fx:signjar>
    <mkdir dir="deploy" />
    <!-- Need to use ${basedir} because somehow the ant task is calculating the directory differently -->
    <fx:deploy
        embedJNLP="false"
        extension="false"
        width="400" height="400" 
        includeDT="false"
        offlineAllowed="true"
        outdir="${basedir}/deploy"
        outfile="JavaFXTester6_Web" 
        placeholderref="webtest" 
        placeholderid="webtest" 
        updatemode="background" >

        <fx:info title="JavaFXTester6_Web" vendor="ZA"/>
        <fx:application refId="fxApplication"/>
        <fx:resources refid="appRes"/>
        <fx:permissions elevated="true"/>
    </fx:deploy>


</target>

运行build.xml后得到的文件系统:

file system

在我的文件浏览器中也一样:

file system 2

我无法找到任何解决方案,每个人都提到从css到bss的转换,但我尝试了两者(所以Main.class.getResource(style.bss)...也是如此)并且没有解决方案。不幸的是,我没有更多的想法。你能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:2)

问题在于您的css文件中的@CHARSET "UTF-8";

JavaFX无法解析它并将抛出一个解析异常。

从css中删除CHARSET声明,然后重试。

答案 1 :(得分:0)

我有同样的问题。在Eclipse中一切正常,但是当我编译并运行jar时,CSS被忽略。提取编译后的jar会在与Java类文件相同的文件夹中显示CSS文件和图像。

FXML

<stylesheets>
  <URL value="@Style.css" />
</stylesheets>

CSS

-fx-background-image: url("background.jpg");

好的,我知道了。 CSS文件和图像文件必须位于jar的根目录中。在Eclipse中,CSS文件和图像文件与Java文件一起位于软件包中,但是在编译时,它们需要进入软件包外部的src文件夹中。

您不需要该行;

Java

ap.getStylesheets().add(Main.class.getResource("style.css").toExternalForm());

FXML文件应该告诉程序在哪里找到CSS文件,而CSS文件告诉程序在哪里找到图像。