JavaFX - 如果css中不存在类,则生成编译时错误

时间:2017-01-24 09:22:10

标签: css eclipse javafx preprocessor

我在JavaFX中开发一个应用程序。现在我遇到了问题,我想在编译时生成错误,如果是css类,例如对于一个按钮,如果在代码中设置了相应的css文件中不存在。

示例:

main.java

        String sCSS = this.getClass().getResource("/main.css").toExternalForm();
        scene.getStylesheets().add(sCSS);
        Button btn = new Button("Hello JFXWorld...");
        btn.getStyleClass().add("button"); // should show compile time error

的main.css

.buttonWithWrongName {
-fx-background-color: red; }

我的解决方案如下,但我正在寻找建议如何实现它。

我包含一个预处理器或创建一个新项目或类似的东西,它解析css代码并动态生成枚举(到.jar中)。这个罐子我可以加入到我的项目中。在最好的情况下,如果没有使用预处理器,ant会自动触发枚举的构建。

再次示例

Css文件与上面相同。

{  在这里为css文件做预处理程序的东西(解析并创建枚举)并将其构建到jar文件中。 }

main.java

        String sCSS = this.getClass().getResource("/main.css").toExternalForm();
                    scene.getStylesheets().add(sCSS);
                    Button btn = new Button("Hello JFXWorld...");
// will throw an compile time error becaus the eMainCSS enum only contains the class ".buttonWithWrongName" 
                    btn.getStyleClass().add(eMainCSS.button.toString()); 

 // works fine 
          btn.getStyleClass().add(eMainCSS.buttonWithWrongName.toString());

我正在使用Eclipse(Neon)和JDK 1.8.0。 我希望有一个解决方案。

感谢您的回答。

最诚挚的问候,

Max S.

- 编辑 -

解决方案:

我使用Ant WatchTask来监视项目中所有较少的文件。 如果我在less文件中更改了某些内容,则ant将运行一个自编写的jar文件,其文件名为参数。 jar将较少的文件转换为css文件(带有less4j),将css文件转换为包含枚举的java文件(我自己的解析器)。

注意:re not allowed to change anything in the enum. Even if you do, after the next changes in the less file, it将会离开。

结果如下所示:

Stylesheet.less:

.button { -fx-stroke-width: (1 + 1); }
#anotherButton { -fx-stroke-width: (1 + 2); }

Stylesheet.css:

.button { -fx-stroke-width: 2; }
#anotherButton { -fx-stroke-width: 3; }

Stylesheet.java:

  // Auto-generated java file

  public enum Stylesheet {

  C_BUTTON("button"),
  ID_ANOTHERBUTTON("anotherButton");

  private final String sValue;

  Stylesheet(String sValue) {
       this.sValue = sValue;
  }

  @Override
  public String toString() {
       return this.sValue;
  }

}

如果我在javafx中使用的类或id不存在,编译器将在编译时抛出错误。

最诚挚的问候,

Max S.

0 个答案:

没有答案