Java JtextPane、JTextField和JLabel都有get/setText方法,有没有办法在没有共享接口的情况下利用这些方法?
我的gui中有一些功能可以随时间更新给定的文本组件。理想情况下,我希望它接受任何具有Java JtextPane、JTextField和JLabel都有get/setText方法,有没有办法在没有共享接口的情况下利用这些方法?,java,Java,我的gui中有一些功能可以随时间更新给定的文本组件。理想情况下,我希望它接受任何具有getText/setText方法的内容。这可以通过JTextField和JTextPane轻松实现,因为它们共享公共父类JTextComponent(其中包含get/set方法)。当我试图包含JLabel时,问题就出现了,因为不幸的是,它的get/setText方法不是来自公共父类或接口 为了解决这个问题,我看到了两条途径 1: 创建一个通用接口EditableText,然后使用实现该接口的自己的别名版本JTe
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
}
}
(注意:实际上没有尝试过上述方法)。同样,我不喜欢的是,仅仅接受一个对象仍然需要三个类(基本功能+两个实现类)
我的问题是,有没有更好的方法来处理这个问题?我的计划中的任何一个方法都是好的吗?我可以从两个方面来看待这一点
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);
}