按名称获取组件不支持所有操作?

Posted

技术标签:

【中文标题】按名称获取组件不支持所有操作?【英文标题】:Getting Components by name not support all actions? 【发布时间】:2014-04-11 19:38:15 【问题描述】:

我有一个名为“p0_1000”的 jTextField

我使用下面的方法可以通过名称调用它;

在类中创建 Hashmap。

private HashMap componentMap;

用组件名称填充 hashmap。

private void createComponentMap() 
    componentMap = new HashMap<String,Component>();
    Component[] components = jDesktopPane1.getComponents();
    for (int i=0; i < components.length; i++) 
            componentMap.put(components[i].getName(), components[i]);
    

按名称调用组件。

public Component getComponentByName(String name) 
    if (componentMap.containsKey(name)) 
            return (Component) componentMap.get(name);
    
    else return null;

如果我直接使用 p0_1000.setToolTipText("trying");当鼠标在相关文本字段上时成功出现工具提示文本。

但如果我使用 getComponentByName("p0_1000").setToolTipText("trying"); setToolTipText 无法识别。

getComponentByName("p0_1000") 我测试成功。因为如果我输入“。”在方法名称之后,可用的操作列表来了,我可以使用它们(例如 .setVisible(false) 成功工作)

当我按名称调用组件时,一些添加、设置或获取不在可用操作列表中的命令。

感谢任何建议、想法、cmets。

问候。

---已解决---

public JComponent getComponentByName(String name) 
    if (componentMap.containsKey(name)) 
            return (JComponent) componentMap.get(name);
    
    else return null;

以上更改解决了我的问题。

【问题讨论】:

【参考方案1】:

您的问题是您的方法被声明为返回Component 类型,如果您查看该类的API,您会发现它没有setToolTipText(...) 方法。此方法从 JComponent 类开始。一种解决方案是让 Map 仅收集 JComponents 并声明方法以返回此类型。顺便说一句,如果您使用泛型参数声明您的地图,则不必进行强制转换。

即,而不是这个声明,

private HashMap componentMap;

使用,

private HashMap<String, Component> componentMap;

或者如果这对你有用:

private HashMap<String, JComponent> componentMap;

【讨论】:

你说得对,谢谢。我将方法 getComponentByName 转换为 JComponent。但是这次我不能在循环中使用这种方法。 Java 说“这里不允许使用 Void 类型”当按名称调用组件时如何使用所有 JComponents 操作? @BlackWhite:你有一个新的不同的问题,一个你还没有清楚地向我们展示的问题,包括代码行等。你的 for 循环是什么意思?我们不擅长阅读思想或看到未显示的代码。考虑在一个新问题中提出这个问题。您需要出示您的代码来解决这个问题,以便我们理解。 抱歉。我使用了 tooltiptex 错误的括号。我将 public Component getComponentByName(String name) 更改为 public JComponent getComponentByName(String name) --- 并返回 (Component) componentMap.get(name);返回 (JComponent) componentMap.get(name);用同样的方法。它对我有用。【参考方案2】:

您可能应该使用具有setToolTipText 的JComponent。如果这不是您想要的,您可以检查 java.awt.Component 是否为 JComponent 并强制转换:

if (components[i]) instanceof JComponent) 
   JComponent jc = (JComponent) components[i];
   // now you can use setToolTipText

【讨论】:

以上是关于按名称获取组件不支持所有操作?的主要内容,如果未能解决你的问题,请参考以下文章

material-ui makeStyles:如何按标签名称设置样式?

各组件的优点

dojo IE 中的“对象不支持此操作”

为啥 collections.sort 在 Java 中按比较器排序时会抛出不支持的操作异常?

NestJS:Mongodb驱动不支持此操作

合并相同名称并获取支持数据的总和 - Reprex