Java 刷新JPanel的组件

Java 刷新JPanel的组件,java,swing,Java,Swing,我正在尝试刷新主JPanel的一些组件(例如子JPanel中包含的JLabels/JTextFields),但似乎无法刷新。组件数据(例如JLabels文本)是基于我的JFrame类的实例变量对象填充的,我想在对象数据更改时刷新这些组件: 我试过使用: jPanel.revalidate(); jPanel.repaint(); 主JPanel和每个组件的子JPanel上都有,但这似乎不起作用。。 有没有关于如何做到这一点的建议 [编辑] 下面是我试图刷新JPanel的代码。

我正在尝试刷新主JPanel的一些组件(例如子JPanel中包含的JLabels/JTextFields),但似乎无法刷新。组件数据(例如JLabels文本)是基于我的JFrame类的实例变量对象填充的,我想在对象数据更改时刷新这些组件:

我试过使用:

    jPanel.revalidate();
    jPanel.repaint();
主JPanel和每个组件的子JPanel上都有,但这似乎不起作用。。 有没有关于如何做到这一点的建议

[编辑] 下面是我试图刷新JPanel的代码。在填充一些字段并按下“save”(保存)按钮触发下面的actionPerformed代码后,弹出的JDialog会触发此操作

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        myObject.setOwner(jTextField1.getText());
        myObject.setPurpose(jTextField2.getText());
        myObject.setProject(jTextField3.getText());
        myObject.setUntil(jTextField4.getText());
        jDialog1.dispose();
        jPanel1.revalidate();
        jPanel1.repaint();
}     

您是否尝试过使用jPanel.removeAll()然后在重新绘制和重新验证之前重新添加文本/图像/按钮组件


或者尝试删除重新验证和重新绘制,然后只调用removeAll,在最坏的情况下,它将显示该代码段是否被命中(假设由于某种原因您没有/不能在该代码段上断点)。

默认情况下,您似乎假设UI组件和应用程序数据之间存在某种绑定。不幸的是,默认情况下没有这样的功能。如果需要这种绑定,就必须使用数据绑定框架

这篇文章讨论了一些这样的数据绑定框架:


如果您想在不使用框架的情况下自己进行绑定,那么可以使用
java.beans.PropertyChangeListener
和java中的相关类。

为了更快地获得更好的帮助,请添加或。顺便问一下,这种布局有什么意义?它看起来像是狗的早餐,只是更凌乱。屏幕截图只是描述了容器的层次结构,而不是布局。顺便说一句,版面事件在这里有什么关系?“版面事件在这里有什么关系”你怎么错过了主要建议?(1-)截图没有告诉我们什么。问题在于创建层次结构的代码。我们不是读心术的人。我们猜不出你在干什么。如果你不发布我们也无能为力。一个简单的
setText()
就足够了。无需刷新任何内容。我尝试在重新验证和重新绘制之前添加jPanel.removeAll(),这会留下一个空的jPanel,因此代码段会被命中。通过“重新添加文本/图像/按钮组件”,init代码通过initComponents()不可修改的Netbeans部分运行。。。那么,除了复制所有自动生成的代码之外,我如何才能真正做到这一点呢?
或者尝试删除您的重新验证并重新绘制
——请不要猜测。“revalidate()”是必需的,因为它调用了面板的布局管理器。默认情况下,组件的大小为(0,0),因此无需绘制任何内容。repaint()只需确保在布局管理器给出组件的尺寸和位置后,面板及其子级才可进行绘制。同时,我同意应避免猜测:a)完全了解重新绘制/重新验证的功能,如果这是一个已部署的应用程序,而不是本地运行的应用程序,那么您可以通过实际“执行”某些操作来验证所包含的功能是否确实受到了影响(我认为这一点相当清楚)。这似乎是问题所在(即,什么也没做)。b) 根据给出的信息,尽可能清晰-使用我们拥有的而不是我们想要的。如果您想检查代码是否已执行,请添加一个简单的System.out.println(…)。不要告诉OP删除代码这是确保调用布局管理器所必需的。您好,Prasad,fair point,但是组件的初始化使用/基于这些应用程序数据,如上所述。我所需要的只是以某种方式“重新运行”仅与JPanel组件相关的init部分(例如,而不是整个JFrame)。我真的需要数据绑定框架吗?是的,可以是数据绑定,也可以是在UI组件中手动设置值。例如
JLabel
JTextField
组件的值是
String
。因此,您将应用程序对象的一些
String
字段设置为
initComponents()
中的组件。稍后,将另一个不同的
字符串
对象设置到应用程序对象的字段。UI组件如何知道您更改了字段值?(
String
对象是不可变的。因此,当
String
字段值更改时,实际上一个
String
对象将被另一个
String
对象替换。)如果我要使用PropertyChangeListener,是否应该将其附加到我的应用程序对象以“侦听”更改?因为如果我理解正确,通常在UI组件中使用PropertyChangeListeners?否,将从应用程序对象触发属性更改事件,UI组件将侦听这些事件并更新自身。(即UI组件将实现
PropertyChangeListener