如何在不知道类型的情况下使用类的方法?

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 类型的情况下存储和获取对象?

如何在不更改输入内容的情况下更改输入值

如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?

如何在不循环的情况下将数组(Range.Value)传递给本机 .NET 类型?