如何在不知道类型的情况下使用类的方法?
Posted
技术标签:
【中文标题】如何在不知道类型的情况下使用类的方法?【英文标题】:How can I use Methods of a class without knowing the type? 【发布时间】:2013-05-21 11:03:47 【问题描述】:我有以下问题:我有一个名为 activeCenter 的 JPanel,我在使用我的程序时会不时在其中保存不同的 JPanel。在这些 JPanel 中有一堆 JTextfields、JLabels 和一个 JButton。 现在我想获取所有文本字段的文本(数量是已知的)。我现在的问题是:我使用 for 循环遍历 JPanel 中的所有组件并检查它是否为 JTextfield。这里的问题是,如果是 JTextField,我该如何使用 Method getText()?我只有组件,不知道如何使用 JTextField 中的方法。有没有办法解决这个问题而不必将 JTextFields 保存在数组中?以下是相关代码:
button.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
for(Component c: activeCenter.getComponents())
if(c.getClass() == JTextField.class)
//use the Method getText() on c
);
【问题讨论】:
【参考方案1】:你需要像这样转换你的 c
对象:
String text = null;
if (c instanceof JTextField)
text = ((JTextField)c).getText();
另请注意,您可以将 instanceof
关键字用于您的 if
条件。
【讨论】:
【参考方案2】:您可以将其转换为 JTextField:
((JTextField) c).getText();
【讨论】:
【参考方案3】:如果我是你,我会进行重新设计:创建一个包含 JPanel
的类并使其实现 Iterable<JTextField>
。创建两个.addComponent()
方法:一个专门添加一个JTextField
,另一个添加一个Component
。将JTextField
元素存储在List
中。
Iterable<JTextField>
的实现就这么简单:
@Override
public Iterator<JTextField> iterator()
return textFields.iterator();
您可以使用 foreach 循环:
for (final JTextField textField: activeCenter)
// use textField.getText()
【讨论】:
以上是关于如何在不知道类型的情况下使用类的方法?的主要内容,如果未能解决你的问题,请参考以下文章
c# 在不知道类型的情况下,如何判断并使用带泛型的扩展方法?
如何在不破坏 localStorage 类型的情况下存储和获取对象?