Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JtextPane、JTextField和JLabel都有get/setText方法,有没有办法在没有共享接口的情况下利用这些方法?_Java - Fatal编程技术网

Java JtextPane、JTextField和JLabel都有get/setText方法,有没有办法在没有共享接口的情况下利用这些方法?

Java JtextPane、JTextField和JLabel都有get/setText方法,有没有办法在没有共享接口的情况下利用这些方法?,java,Java,我的gui中有一些功能可以随时间更新给定的文本组件。理想情况下,我希望它接受任何具有getText/setText方法的内容。这可以通过JTextField和JTextPane轻松实现,因为它们共享公共父类JTextComponent(其中包含get/set方法)。当我试图包含JLabel时,问题就出现了,因为不幸的是,它的get/setText方法不是来自公共父类或接口 为了解决这个问题,我看到了两条途径 1: 创建一个通用接口EditableText,然后使用实现该接口的自己的别名版本JTe

我的gui中有一些功能可以随时间更新给定的文本组件。理想情况下,我希望它接受任何具有
getText/setText
方法的内容。这可以通过
JTextField
JTextPane
轻松实现,因为它们共享公共父类
JTextComponent
(其中包含get/set方法)。当我试图包含
JLabel
时,问题就出现了,因为不幸的是,它的
get/setText
方法不是来自公共父类或接口

为了解决这个问题,我看到了两条途径

1: 创建一个通用接口
EditableText
,然后使用实现该接口的自己的别名版本
JTextField
JTextPane
、和
JLabel

阿拉:

我的问题是,我正在创建大量的类膨胀,只是为了让编译器知道我想访问这些类上的两个方法

2: 某种模板模式是一种东西,它接受一个非常通用的父类,然后将其转换为
JLabel
JTextComponent

大致如下:

class JLabelImplementation {
    
    private JLabel label; 

    public MyClass(JComponent componenet) {
        this.label = (JLabel) component
    }
}


class JTextComponentImplementation {
    
    private JTextComponent textField; 

    public MyClass(JComponent componenet) {
        this.textField = (JTextComponent) component
    }
}
(注意:实际上没有尝试过上述方法)。同样,我不喜欢的是,仅仅接受一个对象仍然需要三个类(基本功能+两个实现类)


我的问题是,有没有更好的方法来处理这个问题?我的计划中的任何一个方法都是好的吗?

我可以从两个方面来看待这一点

  • 你的第一个想法还不错。问题是,仅仅为了实现您的接口而创建虚拟类似乎非常麻烦。解决这个问题的一个可能方法是使用一个重载方法,该方法接受1)
    EditableText
    2)
    JLabel
    和3)
    JTextComponent
    。然而,这并不是万无一失的。可能还有其他swing元素使用
    getText
    /
    setText
    方法,并且最终可能会使用大量重载方法

  • 这是我所知道的“接受任何具有
    getText
    /
    setText
    方法的内容”的唯一方法。我不太喜欢思考,但我认为这样做可能会奏效:

    void foo(Object o)
    {
            Class<?> c = o.getClass();
            for (Method m : c.getDeclaredMethods())
            {
                if (m.getName().equals("setText")||m.getName().equals("getText"))
                {
                //do Something
                }
            }
    }
    
    void foo(对象o)
    {
    c类=o.getClass();
    对于(方法m:c.getDeclaredMethods())
    {
    if(m.getName().equals(“setText”)| | m.getName().equals(“getText”))
    {
    //做点什么
    }
    }
    }
    

  • 这是我所知道的用这些方法检测所有类的唯一可靠方法。希望这有帮助

    你不需要那么多遗产。有一个更简单的解决方案:

    public void setText(JComponent c,
                        String text) {
    
        Objects.requireNonNull(c, "Component cannot be null");
    
        if (c instanceof JTextComponent) {
            ((JTextComponent) c).setText(text);
        } else if (c instanceof JLabel) {
            ((JLabel) c).setText(text);
        } else {
            throw new IllegalArgumentException(
                "Cannot set text of a " + c.getClass().getName());
        }
    }
    
    一种更健壮且类型安全的方法是编写两个重载方法:

    public void setText(JTextComponent tc,
                        String text) {
        tc.setText(text);
    }
    
    public void setText(JLabel label,
                        String text) {
        label.setText(text);
    }
    
    这允许其他代码始终调用
    setText(组件,文本)
    ,只要在编译时知道每个组件的类型

    继承和反思可以完成工作,但它们不是最好的方式。

    我不久前发布过。
    public void setText(JTextComponent tc,
                        String text) {
        tc.setText(text);
    }
    
    public void setText(JLabel label,
                        String text) {
        label.setText(text);
    }