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

Css is not working after deployment of a JavaFX app in Eclipse

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

主要class:

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:

之后得到的文件系统

在我的文件浏览器中也是如此:

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

问题是因为您的 css 文件中的 @CHARSET "UTF-8";

JavaFX 无法解析它,将抛出解析异常。

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

我也遇到了同样的问题。在 Eclipse 中一切正常,但是当我编译 运行 jar 时,CSS 被忽略。提取已编译的 jar 会显示 CSS 文件和图像与 Java class 文件位于同一文件夹中。

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 文件告诉程序在哪里可以找到图像。