【问题标题】:How can I find elements by name or id, on a JPanel?如何在 JPanel 上按名称或 id 查找元素?
【发布时间】:2014-04-22 13:22:03
【问题描述】:

我已经开始使用 Java Swing,我问自己是否可以通过 Id 或仅通过名称在通用 JPanel 上获取元素。 我的意思是类似 'getElementById("example")',用在 javascript 中。

这是一个小例子,是我想要得到的伪代码:

....

myButton = my_panel.getElementById("xxxxxxx");

// OR BY VARIABLE NAME

myButton = my_panel.getElementByVariableName("xxxxxxx");

....

这在java中可能吗?

【问题讨论】:

  • 既然你说你是初学者,我想我们应该问为什么你需要这样做?也许应该问的不同问题有不同的答案。很难说你想要完成什么。
  • 我有两个类:第一个用于在监视器上显示框架,第二个在后台工作以收集一些数据。数据收集后,我希望第二个类将它们插入到 JPanel 上的列表中。为了达到这个目标,我必须在面板上找到元素,然后添加收集到的数据。
  • 为什么不在带有列表的类中创建一个数据类的实例,然后填充它呢?如果需要使用该类创建的新数据再次更新列表,只需更新列表即可。我可能没有关注您面临的实际问题。也许显示一些相关代码会有所帮助。

标签: java swing jpanel


【解决方案1】:

Swing 核心对组件没有Id 的概念。你可以使用setName()设置一个唯一的名字,然后递归遍历容器的组件树,得到某个名字的组件(Get a Swing component by name)。

【讨论】:

    【解决方案2】:

    您可以使用putClientPropertygetClientProperty,如下代码所示:

        JPanel jPanel = new JPanel();
    
        JLabel label=new JLabel("Hi");
        jPanel.add(label);
        jPanel.putClientProperty("hiLabel", label);
    
        System.out.println(jPanel.getClientProperty("hiLabel").getClass().getName());
    

    【讨论】:

      【解决方案3】:

      虽然 Swing 组件可以有一个名称 (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#getName()),但这不是一个 id;由您来确保一致性。

      这个name 属性没有被广泛使用。在SwingUtilities 中没有通过名字找到孩子的方法,只有祖先:SwingUtilities#getAncestorNamed

      您必须自己完成。一般来说,这并非不可能。您将从Container 开始,遍历其子项(Component[] getComponents)并检查名称。对每个 Container 本身的孩子递归地执行此操作。找到就打断。

      但这对于 Swing 来说并不典型。该框架不使用声明性。 (其他 Java GUI 工具包已经或可以,例如 GWT 或 Android 的本机 UI。)您只需存储对您以编程方式创建的组件的引用以供以后使用。

      当然,您不能在 Java 中按 变量 名称进行搜索。该名称在运行时不存在。 Java 的工作方式与 JavaScript 不同。大多数时候,直接将概念从一个系统转移到另一个系统并不是一个好主意。你需要习惯每一个才能充分利用它。

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多