有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java swing更新问题

我有一个Frame类(扩展了JInternalFrame)。在类内部,我正在实例化一个JPanel并初始化setVisisble(false)。在用户单击框架中的一个按钮并进行一些处理后,我调用JPanel中的一个方法来更新它的一个标签。然后我在JPanel上执行setVisible(true)

但是,在我调用JPanel的一个标签上的setText()之后,它并没有正确地“刷新”。在处理并将JPanel设置为visible(我确认正确的数据在那里等)之后,JPanel仍然处于初始化状态

换句话说,我需要做什么才能在一个框架内对一个JPanel调用setText()实际上刷新面板

基本上,我想知道:如果更新了嵌套在JFrame中的swing组件中的标签文本,那么更新是否应该可见?如果没有刷新,需要执行哪些操作


共 (5) 个答案

  1. # 1 楼答案

    为了将内存中对象的更改完全、可靠地应用到GUI上,需要调用相应对象的validate()和repaint()方法。validate()对最新的更改执行某种“提交”操作。因此,如果更改标签的文本,即使调用repaint(),也可能无法看到更改

  2. # 2 楼答案

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

    每次更换标签时,可能需要重新验证面板;例如:

    myPanel.validate()
    

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

  3. # 3 楼答案

    你没有给我们太多可以继续的东西。以下是一些需要检查的常见问题

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

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

  4. # 4 楼答案

    试试这个:

    myPanel.invalidate()
    

    如果这不起作用,那么可以尝试发布一些代码

  5. # 5 楼答案

    谢谢你的回答。事实上,我没有发布任何代码,这使得我不可能解决这个问题(我现在意识到)。这门课相当大,因为我不知道问题出在哪里,所以我只是概述了我认为相关的内容

    无论如何,经过大量挖掘,如果有人遇到类似的事情,这里是出了什么问题:

    我在JPanel内部创建的JLabels正在使用我提供的xyheightwidth方法调整大小。这些对setBounds()的调用最初是在JPanel初始化时完成的。此外,动态地从标签中提取height, width参数(使用getMinimumHeight()等,以便根据标签中的文本量调整标签大小)。问题是一些标签被初始化为no文本,导致宽度为0。所以后来我调用setText()时,它工作正常,只是宽度为0(文本在那里,我就是看不到!)

    不管怎样。。。解决方案就是每次使用setText()时(不仅仅是最初),在标签上调用setBounds()