javafx:如何调用和传递控制对象?

7eumitmz  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(304)

这是一种获取不同javafx控件文本的方法。

private String getText(Node item) {

    String txt = "";

    if (item instanceof Label) {
        if(!((Label)item).getText().isEmpty()){
            txt = ((Label)item).getText();
        }
    }
    if (item instanceof TextField) {
        if(!((TextField)item).getText().isEmpty()){
            txt = ((TextField)item).getText();
        }
    }
    if (item instanceof CheckBox) {
        if(!((CheckBox)item).getText().isEmpty()){
            txt = ((CheckBox)item).getText();
        }
    }
    return txt;
}

我正试图减少代码行数。除了定义标签、文本字段、复选框等,是否有一个对象类可以调用所有其他控件并放在节点项旁边,这样我就不需要重复和指定每个控件?有没有办法做到这一点?

private String getText(Node item, X x) {

    String txt = "";

    if (item instanceof x) {
        if(!((x)item).getText().isEmpty()){
            txt = ((x)item).getText();
        }
    return txt;
}

我应该用什么替换x&x。我不知道应该调用或替换控件的对象。只是不介意isempty的逻辑。我主要关心的是应该调用或替换控件的对象。然后像这样调用该方法

getText(txtSample, TextField.class)

getText(lblSample, Label.class)

非常感谢。

6l7fqoea

6l7fqoea1#

因为普通的超类控件没有方法 getText() (因为并非所有控件都有文本),这是不可能的。
编辑:正如詹姆斯·杜德所指出的, LabelCheckBox 是否有一个拥有该方法的共同祖先 getText() ,即 Labeled . 这为我们节省了另一笔钱 instanceof 检查。
然而,其余的相似之处可以提取出来。假设我们首先编写一个helper方法来从控件中提取文本(注意与 instanceof :

private String getRawText( final Node item )
    {
        if( item instanceof Labeled labeled )
            return labeled.getText();
        else if( item instanceof TextField field )
            return field.getText();
        else //this is the default
            return "";
    }

然后,原始函数变为:

private String getText( final Node item ) 
    {

        final var  txt = getRawText( item );

        return txt.isEmpty() 
                ? ""
                : txt;
    }

但请注意,您需要检查 text.isEmpty() 而您初始化变量时使用的默认值 txt 它本身是空的( "" ). 因此,不需要检查是否为空。你是说 .isBlank() (仅剥离空白字符串)?或 getText() == null ?
否则,它可以被删除,然后你的左功能 getRawText() 只有

相关问题