【问题标题】:Readding panel to layout after editing panel?编辑面板后阅读面板布局?
【发布时间】:2010-10-30 18:08:04
【问题描述】:

我正在尝试做的是动态编辑面板并将其读取到(边框)布局中。面板包含文本字段,我希望用户能够向面板添加或删除文本字段。我尝试如下:从布局中删除面板,向面板添加另一个文本字段,将面板读取到布局中。但是这不起作用(什么也没发生;只有面板被删除但没有读取其中的新文本字段,因此该区域只是空的)。即使我从布局中删除了面板,然后在该位置(BorderLayout.EAST)向布局中添加了另一个组件;什么也没发生(只是空的)。

这是不工作的代码部分:

vfields[blocks] = new TextField("0"); //add new textfield to the array of textfields
blocks    += 1;
dp.blocks = blocks;
this.remove(values_fields); //remove the values_fields panel from the borderlayout
values_fields.add(vfields[blocks]); //add new component,textfield to the panel
this.add(values_fields, BorderLayout.EAST); //readd the panel to the border layout<-- doesn't work

我希望任何人都可以帮助我。我对 Java 比较陌生,所以我可能只是在做一些完全错误的事情或其他事情,但我自己看不到。

提前致谢!

Skyfe。

【问题讨论】:

    标签: java layout awt panels


    【解决方案1】:

    无需移除整个面板。您可以将组件删除/添加到现有面板。在可见的 GUI 上,代码的顺序是:

    panel.remove(...);
    panel.add(...);
    panel.revalidate();
    panel.repaint();
    

    如果您需要更多帮助,请发布您的 SSCCE

    【讨论】:

    • 嗨,我试过了,它可以从面板中删除组件。但是,当我尝试以这种方式动态地将组件添加到面板时,它不起作用。作品: values_fields.remove(vfields[blocks-1]); values_fields.validate(); values_fields.repaint();不起作用:values_fields.add(vfields[blocks]); values_fields.validate(); values_fields.repaint();
    • 更新:我似乎在使用 add 方法的部分得到了 Java NullPointerException:values_fields.add(vfields[blocks])。怎么了?
    • 如果添加组件时它不起作用,那么可能是因为您使用的布局管理器需要您指定约束。例如,当您使用 IDE 创建表单时,就会发生这种情况。大多数 IDE 使用 GroupLayout,这需要您指定几个约束。我的建议是转储 IDE 并自己编写表单代码,这样您就知道如何添加组件以及如何指定所需的约束。
    • 感谢您的回复,我已经搞定了;使用你的方法。我犯了一些愚蠢的错误:我引用我创建的对象( vfields[blocks] )的方式与创建它的方式相同(也使用块的值作为索引)但是在创建对象和使用它之间我增加了块使它引用一个尚不存在的对象,所以我将 int 块的增加移到它之后,它现在正在工作。非常感谢!
    【解决方案2】:

    看起来它不会再次重绘。 你有没有试过在gui改变后调用以下两种方法:

      validate();
      repaint();
    

    【讨论】:

    • 是的,当我在 GUI 更改后调用这些方法时,它仍然没有显示任何内容。就好像它只是从边界布局中删除了面板 value_fields 因为它在那个地方仍然是空的。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2017-07-10
    • 1970-01-01
    • 2012-10-04
    • 2023-04-05
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多