Skip to main content
 首页 » 编程设计

java之您知道在不使用 CSS 属性的情况下获取 TextArea 的 JavaFX Text 节点的方法吗

2023年09月11日28小虾米

我希望找到一种无需使用 CSS 属性即可获取 TextArea 的 Text 节点的方法。 JavaFX 的 Text 节点暴露了方法 setUnderline(boolean) 通过它我可以设置 TextArea 的下划线属性;相反,TextArea 不公开相同的方法。此外,TextArea.getText() 方法返回一个 String 而不是 Text 对象。 所以,我解决了这个问题如下: 在代码中,

// Fields.. 
private final PseudoClass pseudoClass = PseudoClass.getPseudoClass("underlined"); 
private final SimpleBooleanProperty underlinedProperty = new SimpleBooleanProperty(false); 
private final TextArea textArea = new TextArea(); 
 
[...] 
 
// In a method (ex. in the constructor).. 
{ 
    textArea.setId("textArea");  
    underlinedProperty.addListener(new ChangeListener<Boolean>() { 
        @Override 
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
            Node node = textArea.getScene().lookup("#textArea .text");   
            node.pseudoClassStateChanged(pseudoClass, newValue); 
        } 
    }); 
} 
 
[...] 
 
// The class exposes the getter method for the underlinedProperty 
public SimpleBooleanProperty getUnderlinedProperty() { 
    return underlinedProperty; 
} 

现在,我用这段代码创建了一个 CSS 表:

#textArea .text { 
    /* some styles */ 
    -fx-underline: false; 
} 
 
#textArea .text:underlined { 
    -fx-underline: true; 
} 

最后在其他一些类中调用了上面的类:

{ 
    'handleOfClassInPoint1'.getUnderlineProperty().set(true); // or false 
} 

问题出在 lookup() 方法上:只有在创建了所有 fx 节点时,该方法才返回一个非空值,即仅在一些图形结果之后。 我希望找到一个程序来设置 TextArea 的下划线属性而不使用 CSS(例如,切换按钮管理下划线属性:如果选择切换,则 TextArea 的文本带有下划线)。 任何人都可以帮助我吗? 非常感谢!

请您参考如下方法:

根据您在问题评论中的描述,我会推荐以下内容。

创建自定义 TextArea看起来像这样:

public class CustomTextArea extends TextArea { 
 
    private static final PseudoClass UNDERLINED = PseudoClass.getPseudoClass("underlined"); 
 
    private final BooleanProperty underlined = new SimpleBooleanProperty(this, "underlined") { 
        @Override 
        protected void invalidated() { 
            pseudoClassStateChanged(UNDERLINED, get()); // update PseudoClass state to match  
                                                        // the current value of the property 
        } 
    }; 
 
    // property access methods 
 
    public final void setUnderlined(boolean underlined) { 
        this.underlined.set(underlined); 
    } 
 
    public final boolean isUnderlined() { 
        return underlined.get(); 
    } 
 
    public final BooleanProperty underlinedProperty() { 
        return underlined; 
    } 
 
    // constructor       
 
    public CustomTextArea(String text, boolean underlined) { 
        super(text); 
        setUnderlined(underlined); 
        getStyleClass().add("custom-text-area"); // to allow specific CSS styling 
    } 
 
} 

然后在你的 CSS 中你会这样做:

.custom-text-area .text { 
    -fx-underline: false; 
} 
 
.custom-text-area:underlined .text { 
    -fx-underline: true; 
} 

CSS 设置在任何 TextCustomTextArea 的后代节点. 第一个 CSS 规则(没有“:下划线”的那个)甚至可能不是必需的,因为默认为 -fx-underline对于 Text节点是 false .

然后查询文本是否带下划线很简单,调用area.isUnderlined()即可。其中 areaCustomTextArea 的实例.

要保持正确的视觉状态,您可以绑定(bind) underlined CustomTextArea 的属性(property)双向到 selected ToggleButton 的属性.当一个发生变化时,另一个将反射(reflect)该变化。

如果您只想为特定的 CustomTextArea 添加样式那么你仍然可以给它一个 ID 并在 CSS 中用 #ID 引用它.