java swing更新问题
我有一个Frame类(扩展了JInternalFrame)。在类内部,我正在实例化一个JPanel并初始化setVisisble(false)
。在用户单击框架中的一个按钮并进行一些处理后,我调用JPanel中的一个方法来更新它的一个标签。然后我在JPanel上执行setVisible(true)
但是,在我调用JPanel的一个标签上的setText()
之后,它并没有正确地“刷新”。在处理并将JPanel设置为visible(我确认正确的数据在那里等)之后,JPanel仍然处于初始化状态
换句话说,我需要做什么才能在一个框架内对一个JPanel调用setText()
实际上刷新面板
基本上,我想知道:如果更新了嵌套在JFrame中的swing组件中的标签文本,那么更新是否应该可见?如果没有刷新,需要执行哪些操作
# 1 楼答案
为了将内存中对象的更改完全、可靠地应用到GUI上,需要调用相应对象的validate()和repaint()方法。validate()对最新的更改执行某种“提交”操作。因此,如果更改标签的文本,即使调用repaint(),也可能无法看到更改
# 2 楼答案
你为什么要提前创建JPanel?为什么不在第一次使用正确的文本重新创建它呢
每次更换标签时,可能需要重新验证面板;例如:
这个额外的面板需要完成什么?也许你应该使用对话;或者只是将JPanel添加到现有框架中
# 3 楼答案
你没有给我们太多可以继续的东西。以下是一些需要检查的常见问题
你是否覆盖了JInternalFrame的任何画法?如果是这样的话,一定要在完成绘制后调用基类版本。基类版本处理面板周围的边框和其他GUI对象的剪辑等问题
您确定接收setText()调用的label变量与添加到JPanel的变量相同吗
# 4 楼答案
试试这个:
如果这不起作用,那么可以尝试发布一些代码
# 5 楼答案
谢谢你的回答。事实上,我没有发布任何代码,这使得我不可能解决这个问题(我现在意识到)。这门课相当大,因为我不知道问题出在哪里,所以我只是概述了我认为相关的内容
无论如何,经过大量挖掘,如果有人遇到类似的事情,这里是出了什么问题:
我在
JPanel
内部创建的JLabels
正在使用我提供的x
、y
、height
和width
方法调整大小。这些对setBounds()
的调用最初是在JPanel
初始化时完成的。此外,动态地从标签中提取height, width
参数(使用getMinimumHeight()
等,以便根据标签中的文本量调整标签大小)。问题是一些标签被初始化为no文本,导致宽度为0。所以后来我调用setText()
时,它工作正常,只是宽度为0(文本在那里,我就是看不到!)不管怎样。。。解决方案就是每次使用
setText()
时(不仅仅是最初),在标签上调用setBounds()