Css 动态对象的JavaFX文本样式

Css 动态对象的JavaFX文本样式,css,javafx,Css,Javafx,我在中使用了一个列表视图和许多样式化的文本。目前,我正在做这样的事情 case COMMENT: t = new Text(lexer.comment.toString()); t.setStyle(BASE_STYLE + COMMENT_STYLE); 其中样式存储为java字符串。我的应用程序中有一个global.css,用于设置场景中一些静态节点的样式,但是对于通过编程创建的文本,我不知道如何访问它。我尝试使用t.setId(..)并在css文件中放置样式定义,但这不起作用 是

我在中使用了一个
列表视图
和许多样式化的
文本
。目前,我正在做这样的事情

case COMMENT:
  t = new Text(lexer.comment.toString());
  t.setStyle(BASE_STYLE + COMMENT_STYLE);
其中样式存储为java字符串。我的应用程序中有一个
global.css
,用于设置场景中一些静态节点的样式,但是对于通过编程创建的文本,我不知道如何访问它。我尝试使用
t.setId(..)
并在css文件中放置样式定义,但这不起作用


是否有一种方法可以将不同文本类型的所有样式存储在一个css中并轻松访问它们?注意,我正在创建许多文本对象

有三种方法可以将CSS样式应用于JavaFX节点(或它们的组合):

  • 正如Tom提到的,
    节点
    的css样式类通过访问。这将返回一个ObservableList,您可以在其中添加和删除样式类
  • 如果经常更改节点样式,则最好使用伪选择器,如带有的
    :hover
    :active
  • 您已经发现的第三个选项(
    setStyle()
    ),但是我不喜欢这个选项,因为将CSS部分移动到一个单独的文件中有很多好处

  • 对于#1和#2,需要使用或将样式表附加到存储CSS定义的场景/节点。例如:

    listView.getStylesheets().add(getClass().getResource("myStyles.css").toExternalForm());
    

    #1的附加信息:

    如果要将样式类
    my node
    添加到JavaFX节点:

    node.getStyleClass().add("my-node");
    
    现在,您可以在CSS文件中设置该节点的样式:

    .my-node {}
    

    #2的附加信息:

    您可以使用声明和使用自己的伪类

    PseudoClass comment = PseudoClass.getPseudoClass("comment");
    node.pseudoClassStateChanged(comment, true);
    node.pseudoClassStateChanged(comment, false);
    
    在css文件中:

    .my-node:comment {}
    

    有三种方法可以将CSS样式应用于JavaFX节点(或它们的组合):

  • 正如Tom提到的,
    节点
    的css样式类通过访问。这将返回一个ObservableList,您可以在其中添加和删除样式类
  • 如果经常更改节点样式,则最好使用伪选择器,如带有的
    :hover
    :active
  • 您已经发现的第三个选项(
    setStyle()
    ),但是我不喜欢这个选项,因为将CSS部分移动到一个单独的文件中有很多好处

  • 对于#1和#2,需要使用或将样式表附加到存储CSS定义的场景/节点。例如:

    listView.getStylesheets().add(getClass().getResource("myStyles.css").toExternalForm());
    

    #1的附加信息:

    如果要将样式类
    my node
    添加到JavaFX节点:

    node.getStyleClass().add("my-node");
    
    现在,您可以在CSS文件中设置该节点的样式:

    .my-node {}
    

    #2的附加信息:

    您可以使用声明和使用自己的伪类

    PseudoClass comment = PseudoClass.getPseudoClass("comment");
    node.pseudoClassStateChanged(comment, true);
    node.pseudoClassStateChanged(comment, false);
    
    在css文件中:

    .my-node:comment {}
    

    为什么不使用css类选择器?顺便说一句,这里有Styledtext控件,那么为什么要重新创建自己的呢?@tomsontom但是当我创建一个带有
    text t=new text(“blub”)
    的文本时,我如何才能访问我的全局css文件呢?当我使用
    setStyle
    引用css类时,这没有任何效果。关于风格文本:我想这样做,但在链接的问题中,我已经解释了我试图做什么。我有一周200英镑的奖金,但只有一个用户写了答案。访问css类是通过getStyleclass()完成的。add(“mycssclass”)在efxclipse,我们有一个名为StyledTextArea的控件,它可以加载文本和颜色区域——它还使用ListView——我稍后会尝试写一篇关于它的博客today@tomsontom告诉我你什么时候做的!对于我的实际应用程序,在Java7中使用swing可能会更好,因为这是Mathematica附带的版本,用户不必关心新的jre。虽然JavaFX我不知道它当时是什么形状。为什么不使用css类选择器呢?顺便说一句,这里有Styledtext控件,那么为什么要重新创建自己的呢?@tomsontom但是当我创建一个带有
    text t=new text(“blub”)
    的文本时,我如何才能访问我的全局css文件呢?当我使用
    setStyle
    引用css类时,这没有任何效果。关于风格文本:我想这样做,但在链接的问题中,我已经解释了我试图做什么。我有一周200英镑的奖金,但只有一个用户写了答案。访问css类是通过getStyleclass()完成的。add(“mycssclass”)在efxclipse,我们有一个名为StyledTextArea的控件,它可以加载文本和颜色区域——它还使用ListView——我稍后会尝试写一篇关于它的博客today@tomsontom告诉我你什么时候做的!对于我的实际应用程序,在Java7中使用swing可能会更好,因为这是Mathematica附带的版本,用户不必关心新的jre。虽然JavaFX我不知道它当时是什么形状。Grmpf…,但我的它与你的#1完全一样,但在添加样式时使用了
    “.my node”
    ,我想知道为什么它不起作用。重要的总是小事情。如果这回答了您的问题,请相应地标记答案;-)Grmpf..,我拥有的与你的#1完全相同,但在添加样式时使用了
    “.my node”
    ,我想知道为什么它不起作用。重要的总是小事。如果这回答了您的问题,请相应地标记答案;-)