【问题标题】:Iterate Through JPanel Components In Hashmap遍历 Hashmap 中的 JPanel 组件
【发布时间】:2014-08-12 22:15:57
【问题描述】:

我有一个 JPanel 组件的 Hashmap,我正在尝试迭代和设置样式,我过去曾在 JPanel 上使用 JButtons 完成此操作,但我无法获取 JLabel 特定的属性。我得到的代码:

 for (Component item : imageAreas.values()) {
        // Style components item.setBorder(BorderFactory...);
    }

问题是组件没有 setBorder() 属性,有什么方法可以在 for 循环中将组件项转换为 JPanel? - 我尝试在所有内容前面添加(JLabel),但它不喜欢那样。 imageAreas 是哈希图。

【问题讨论】:

    标签: java swing jpanel


    【解决方案1】:

    有什么方法可以将组件项转换为 JPanel?

    JPanel panel = (JPanel)item;
    item.setBorder(...);
    

    以上假设您确实在 Hashmap 中有 JPanel。

    问题是,当您可以使用包含 JPanel 的 Hashmap 时,为什么要使用包含组件的 Hashmap?要创建 HashMap,您可以执行以下操作:

    HashMap<String, JPanel> imageAreas = new HashMap<String, JPanel>();
    

    然后访问面板,您可以这样做:

    for (JPanel panel : imageAreas.values()) {
            panel.setBorder(BorderFactory...);
    }
    

    【讨论】:

    • 啊哈! - 没有错误,是的,它只是 JPanels - 谢谢!
    • 你知道我从来没有考虑过......为什么我不直接使用 JPanels .. 确实是个好问题:L - 你知道我现在遇到的第二个问题吗?
    【解决方案2】:

    您对发生此错误的原因是正确的(“组件没有 setBorder() 属性”),并且您在转换为 JPanel 方面处于正确的轨道上。

    我尝试在所有内容前添加 (JPanel),但它不喜欢这样。

    这可能是因为您数组中的某些组件不是JPanels,因此当您尝试将它们转换为JPanel 时会抛出ClassCastException。所以,你需要先检查:

    for (Component item : imageAreas.values()) {
        if (item.instanceOf(JPanel.class)) { 
           JPanel pan = (JPanel)item;
           pan.setBorder(...);
        }
    }
    

    【讨论】:

    • 我的意思是输入“JLabel”而不是 JPanel - 错字:P
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2020-03-15
    相关资源
    最近更新 更多