【问题标题】:get access to each dynamically added jComponent访问每个动态添加的 jComponent
【发布时间】:2015-07-22 10:42:18
【问题描述】:

在我已经提出问题并且可以使用此answer for my question 从动态添加的jTextFieldsjComboBoxes 中获得价值之前。

现在在我的 subPanel 中,我有 3 个 jComboBoxes 和 4 个 jTextFields

要获得jComponent 的值,我正在使用此代码:

Component[] children = jPanel1.getComponents();
// iterate over all subPanels...
for (Component sp : children) {
    if (sp instanceof subPanel) {
        Component[] spChildren = ((subPanel)sp).getComponents();
        // now iterate over all JTextFields...
        for (Component spChild : spChildren) {
            if (spChild instanceof JTextField) {
                String text = ((JTextField)spChild).getText();
                System.out.println(text);
            }
        }
    }
}

我想问是否可以分别访问每个jComboBoxesjTextFields,即我可以操纵每个jComponent 并设置它们不同的值吗?我怎样才能做到这一点?

提前谢谢你。

【问题讨论】:

  • 为什么不为每个 Components 保留实例变量,而不是深入到组件层次结构中?
  • @copeg 如果可能的话,你能给我看一些例子吗,我的 Java 技能不是很好,但是在 Stackoverflow 上一天比一天好
  • 动态添加它们时,您可以为组件的 ArrayList 中的每个新元素保留一个引用。这样你就知道哪个是哪个了

标签: java swing


【解决方案1】:

由于这两个类(JComboBoxJTextField)都扩展了 JComponent,因此您可以创建一个 ArrayList 并将它们添加到其中。即

ArrayList<JComponent> components = new ArrayList<JComponent>();
JComboBox pie = new JComboBox();
components.add(pie)
//pie is now stored in components as a JComponent

当您需要引用pie时可以拨打:

JComboBox pie = (JComboBox) components.get(0);

这可以使用任何JComponent 来完成,并且要引用它,您只需将其投射到它的出路。但是,这种方法可能会导致一些混乱。因此,您应该记住添加它们的顺序,或者以非常具体的方式添加它们(即首先是 TextFields,然后是 ComboBoxes)。

【讨论】:

    【解决方案2】:

    我想问是否可以分别访问每个 jComboBoxes 和 jTextFields,即我可以操作每个 jComponent 并设置它们不同的值吗?我怎样才能做到这一点?

    您可以保留对组件的引用,而不是遍历组件层次结构(这对布局更改很脆弱)。以下示例是一个包含子组件实例变量的类:

    public class ComponentWrapper extends JComponent{
    
        private JComboBox combo;
        private JTextArea textArea;
    
        public ComponentWrapper(){
            combo = new JComboBox();
            textArea = new JTextArea();
            add(combo);
            add(textArea);
        }
    
        public Text getTextArea(){
            return textArea;
        }
    
        public JComboBox getComboBox(){
            return comboBox;
        }
    }
    

    上面的类扩展了JComponent,在构造函数中添加了组件,并且可以在其他地方添加到另一个Container。 请注意,上面的类只是一个示例,可能需要根据您的要求进一步调整。 用法:

    ComponentWrapper wrapper = new ComponentWrapper ();
    add(wrapper);
    revalidate();//if adding 'dynamically'
    
    //later, when you want to get the text
    String text = wrapper.getTextArea().getText();
    

    【讨论】:

    • 抱歉耽搁了,我实现你的方法需要很长时间,而且效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-01-09
    相关资源
    最近更新 更多