JavaFX-如果类不';不存在于css中

JavaFX-如果类不';不存在于css中,css,eclipse,javafx,preprocessor,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("Hell

我用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
        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());
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...");
        btn.getStyleClass().add("button"); // should show compile time error
        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)和JDK1.8.0。 我希望有个解决办法

谢谢你的回答

致以最良好的祝愿

马克斯S


--编辑--

解决方案: 我使用了一个浏览器来查看项目中所有较少的文件。 如果我更改less文件中的某些内容,ant将运行一个以文件名为参数的自写jar文件。jar将less文件转换为css文件(使用),将css文件转换为包含枚举的java文件(我自己的解析器)

注意:您不允许更改枚举中的任何内容。即使您这样做了,在less文件中进行下一次更改后,它将消失

结果如下所示:

Stylesheet.less:

要访问Stylesheet.css:

要访问Stylesheet.java:

}

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

致以最良好的祝愿


Max S.

这是个非常糟糕的主意。假设您使用的枚举常量包含正确的样式类。然后修改枚举并将字符串更改为不正确的字符串。现在,所有使用enum常量的类都应该产生编译时错误,但它们甚至没有重新编译,那么编译器应该如何知道它们呢?然后修改CSS文件。在这种情况下编译器甚至不运行。。。更好地对枚举进行注释,并使用注释处理器为检查CSS的测试套件创建数据…而且您似乎假设CSS文件的位置始终可以在编译时确定。。。如果是,例如,从用户首选项或属性文件/@fabian检索到的,该怎么办?我将使用ant检查我的项目结构中是否对css/less文件进行了更改。然后ant将触发从less到css以及从css到enum的转换。我永远不会自己修改枚举,它是自动生成的。我要修改的唯一文件将是less文件。我已经找到了一个有效的解决方案。我将在大约8小时后发布它。@James_D-即使在这种情况下,按钮也需要“知道”它们分配给的类/ID,因此用户定义的css样式表类或ID名称必须遵循“原始”名称。否则,定义类就没有任何意义。枚举将在生成根项目之前自动生成,因此名称将匹配。独立于使用的css文件。
  // 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;
  }