【问题标题】:Unable to remove JLabel from JPanel after adding programmatically以编程方式添加后无法从 JPanel 中删除 JLabel
【发布时间】:2013-04-23 04:39:27
【问题描述】:

我有一个名为 LMSPanel 的类,它扩展了 JPanel。该类有以下两种方法:

/**
 * A method to add an informative temporary label to the Panel until
 * the second Sensor is added.
 * 
 * @param zoneid   - The ID of the Zone.
 * @param sensorid - The ID of the Sensor.
 */
public void justAddedLbl(String zoneid, String sensorid)
{
    infoLbl = new JLabel("Sensor: " + zoneid + sensorid + " added. Please Add 2nd Sensor.");
    add(infoLbl);
    revalidate();
}

/**
 * A method to remove the temporary informative label.
 * Only called when second sensor has been added.
 */
public void removeInfoLbl()
{
    remove(infoLbl);
    revalidate();
}

添加方法工作正常,但是当我尝试调用removeInfoLbl 时,标签会保留并消失。我已经尝试了repaint() 以及我在网上找到的各种组合,但我仍然无法删除 JLabel。

我做错了什么?

【问题讨论】:

  • 听起来您有参考问题。当调用justAddedLbl 时,您正在创建一个新标签,这意味着如果多次调用它,您将只能引用最后添加的标签。从 sn-p 不可能确定
  • “无法删除 JLabel” 为什么不直接使用 label.setText("");
  • @MadProgrammer 我也是这么想的,但是每个 LMSPanel 的每个方法只调用一次。所以我首先打电话给justAddedLbl(),然后我总是直接打电话给removeInfoLbl()。而infoLbl 是 JLabel 类型的私有字段。
  • @ciwan 没有可运行的示例,就不可能知道。可以尝试更改标签的文本以确保(而不是尝试删除它)
  • 我尝试更改文本。那也没有用。我的猜测是它一定是一个参考问题,但不知道为什么。

标签: java swing jpanel jlabel


【解决方案1】:

我很快就尝试过了,调用 repaint() 而不是 revalidate() 对我有用。我认为标签没有消失的原因是面板没有重新粉刷。

如果您总是只显示一个标签,为什么不像 Andrew Thompson 建议的那样使用 setText()。

【讨论】:

  • 我真的为此失去了理智。与昨天完全相同的代码,就像 MadProgrammer 建议的那样,唯一的区别是我向朋友展示了 TeamViewer 的问题,你猜怎么着,它决定工作!我的猜测是,Eclipse 和 PC 需要重新启动? ://
【解决方案2】:
  public void removeInfoLbl()
    {
  remove(infoLbl);
  revalidate();
  repaint();
  SetVisible(true);
 }

SetVisbile(true) 这将显示您当前可用的视图.. 所以试试这个..

【讨论】:

  • 你真的认为整个Container 是不可见的吗?当Container 不可见时,他如何能够检测到JLabel 未被删除
  • Jlabel 已被删除,但容器仍然多次显示该 j 标签.. 所以如果我们再次使用 Setvisble(true).. 它将显示当前容器...
  • @Ciwan 你有答案吗?
  • Revalidate 调用 repaint,我很确定 remove 会使您的容器无效并且组件已经可见,调用 setVisible(true) 将无效
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多