Java Swing 更新问题

3
我有一个框架类(扩展自JInternalFrame)。 在类内部,我正在实例化一个JPanel并初始化setVisisble(false)。 用户在框中单击按钮并执行一些处理之后,我调用JPanel中的某个方法来更新其标签之一。 然后我在JPanel上执行setVisible(true)
然而,在我调用setText()之后,JPanel没有正确地“刷新”。 经过处理并将JPanel设置为可见(并确认数据已到位等),JPanel仍处于初始化状态。
换句话说,如何使在带有JFrame嵌套的Swing组件中更新标签的文本可见? 如果不行,需要做什么才能刷新?
基本上我想知道:如果您更新嵌套在JFrame内部的Swing组件中的标签的文本,是否应该显示更新? 如果不是,则需要做什么来刷新?
5个回答

2
感谢您提供的所有答案。我没有发布任何代码,这使得解决问题变得不可能(我现在意识到了)。这个类相当大,由于我不知道问题所在,所以我只是概述了我认为相关的内容。
无论如何,在经过大量挖掘后,以下是如果有人遇到类似问题的情况:
我在JPanel中创建的JLabels使用setBounds()方法进行大小调整,其中我提供xyheightwidth。这些对setBounds()的调用最初是在初始化JPanel时完成的。此外,height, width参数是从标签动态获取的(使用getMinimumHeight()等),因此标签的大小根据其中的文本量进行调整。问题在于,一些标签被初始化为没有文本,导致宽度为0。因此,当我调用setText()时,它是正常工作的,除了宽度为0(文本存在,但我看不到它!)。
无论如何...解决方案很简单,就是每次使用setText()时都要在标签上调用setBounds()(而不仅仅是最初)。

2

试试这个:

myPanel.invalidate()

如果那不起作用,或许可以尝试发布一些代码。

2

为什么你要提前创建JPanel呢?为什么不在第一次需要的时候重新创建它,用正确的文本呢?

并且每次更改标签后,您可能需要重新验证面板;即:

myPanel.validate()

这个额外的面板需要实现什么功能?也许你应该使用对话框;或者只需将JPanel添加到现有框架中。

1

你没有给我们提供太多信息。以下是一些常见的检查事项。

你是否覆盖了JInternalFrame的任何paint方法?如果是这样,请确保在完成绘制后调用基类版本。基类版本处理诸如面板周围的边框和其他GUI对象的剪辑等问题。

你确定接收setText()调用的label变量与你添加到JPanel中的变量相同吗?


0
为了确保内存中对象的更改完全且确定地应用于GUI,您需要调用相应对象的validate()和repaint()方法。 validate()执行最新更改的“提交”操作。因此,如果您更改标签的文本,则即使调用repaint(),您也可能无法看到更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接