gpt4 book ai didi

java - JtextPane、JTextField 和 JLabel 都有 get/setText 方法,有没有办法在没有共享接口(interface)的情况下利用它?

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:50 25 4
gpt4 key购买 nike

我的 GUI 中有一些功能可以随着时间的推移更新给定的文本组件。理想情况下,我希望它接受任何具有 getText/setText 方法的内容。使用 JTextFieldJTextPane 可以轻松完成此操作,因为它们共享公共(public)父类 JTextComponent(包含 get/set 方法)。当我尝试包含 JLabel 时,问题就出现了,因为不幸的是,它的 get/setText 方法并非来自公共(public)父类或接口(interface)。

为了解决这个问题,我看到了两条路。

1:

创建一个通用接口(interface) EditableText,然后拥有我自己的实现该接口(interface)的 JTextFieldJTextPaneJLabel 别名版本。

阿拉:

public class MyJTextField extends JTextField implements EditableText {

}

我的问题是,我创建了大量的类膨胀,以便编译器知道我想要访问这些类上的两个方法。

2:

某种类似模板模式的东西,它接受一个非常通用的父类,然后将其转换为 JLabelJTextComponent

大致如下:

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. 你的第一个想法不错。问题在于,创建虚拟类来实现您的接口(interface)似乎非常麻烦。解决此问题的一种可能方法是使用一个重载方法,该方法接受 1) EditableText 2) JLabel 和 3) JTextComponent。然而,这并非完全万无一失。可能还有其他带有 getText/setText 方法的 swing 元素,最终可能会出现大量重载方法。

  2. 这是我所知道的“接受任何具有 getText/setText 方法的东西”的唯一方法。反射。我不太使用 Reflection,但我认为这样的东西可能会起作用:

    void foo(Object o)
    {
    Class<?> c = o.getClass();
    for (Method m : c.getDeclaredMethods())
    {
    if (m.getName().equals("setText")||m.getName().equals("getText"))
    {
    //do Something
    }
    }
    }

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

关于java - JtextPane、JTextField 和 JLabel 都有 get/setText 方法,有没有办法在没有共享接口(interface)的情况下利用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com