Java swing--Jpanel不重新命名/重新绘制自身

Java swing--Jpanel不重新命名/重新绘制自身,java,swing,user-interface,jpanel,repaint,Java,Swing,User Interface,Jpanel,Repaint,我正在使用一个带有propertyChangeListener的JPanel,并希望它在某个特定变量模型发生更改时根据其自身重新命名。我的代码如下- labelMacroModel.addMacroModel(addedMacroModel); private List<MacroModel> macroModelList;// this is the list of all MacroModels public void addMacroModel(MacroModel macr

我正在使用一个带有propertyChangeListener的JPanel,并希望它在某个特定变量模型发生更改时根据其自身重新命名。我的代码如下-

labelMacroModel.addMacroModel(addedMacroModel);
private List<MacroModel> macroModelList;// this is the list of all MacroModels
public void addMacroModel(MacroModel macroModel) {
        macroModelList.add(macroModel);

        pcs.fireIndexedPropertyChange("LabelMacroModel", macroModelList.size(), null, macroModel);
    }
当我在eclipse中使用调试模式时,我可以看到,无论何时对模型进行更改,它都会触发调用propertyChange,并且还会运行重新验证和重新绘制,但只有JPanel显示保持不变。它似乎没有重新招标。 我在这里遗漏了什么基本的东西

编辑:

im更改的属性的示例片段如下-

labelMacroModel.addMacroModel(addedMacroModel);
private List<MacroModel> macroModelList;// this is the list of all MacroModels
public void addMacroModel(MacroModel macroModel) {
        macroModelList.add(macroModel);

        pcs.fireIndexedPropertyChange("LabelMacroModel", macroModelList.size(), null, macroModel);
    }
其中labelMacroModel为labelMacroModel类型,addedMacroModel为Macro类型

现在,引发属性更改的LabelMacroModel类的相关部分如下-

labelMacroModel.addMacroModel(addedMacroModel);
private List<MacroModel> macroModelList;// this is the list of all MacroModels
public void addMacroModel(MacroModel macroModel) {
        macroModelList.add(macroModel);

        pcs.fireIndexedPropertyChange("LabelMacroModel", macroModelList.size(), null, macroModel);
    }


不清楚如何更改面板中的组件。如果面板未更新,则重新喷漆/重新验证将无效。我认为,如果不修改组件的布局方式,就不需要显式调用revalidate/repaint。例如,JButton.setText应该更改按钮的标签,而不需要调用repaint。

不清楚如何更改面板中的组件。如果面板未更新,则重新喷漆/重新验证将无效。我认为,如果不修改组件的布局方式,就不需要显式调用revalidate/repaint。例如,JButton.setText应该在不调用repaint的情况下更改按钮的标签。

要扩展上面AKJ的答案,我认为您应该在属性更改时重建组件。因此,执行remove all then Reading是一种方法。一旦你完成了这项工作,你就可以更加有选择性地将模型更新推送到GUI中,例如,如果添加了一个新条目,那么只需添加一个新组件来反映这一点。不过,对于很多情况,removeall/readd都很好。HTH.

要进一步阐述上述AKJ的答案,我认为您应该在财产变更方面重建您的组件。因此,执行remove all then Reading是一种方法。一旦你完成了这项工作,你就可以更加有选择性地将模型更新推送到GUI中,例如,如果添加了一个新条目,那么只需添加一个新组件来反映这一点。不过,对于很多情况,removeall/readd都很好。HTH.

我在这里遗漏了什么基础知识?一个让我感兴趣的SSCE?你能给出一个你改变的属性的例子吗?@PerryMonschau-Ive编辑提供了一个我改变的属性的代码片段。你的程序应该做什么,而不是显示代码片段?该项目的总体工作是什么?该JPanel的具体工作是什么?使用不同的方法可能会更好,但我们只能在您提供更多信息的情况下才能做出决定。与手头的问题无关:不要调用setXXSize任何我在这里缺少的基本功能?一个让我感兴趣的SSCE?你能给出一个你改变的属性的例子吗?@PerryMonschau-Ive编辑提供了一个我改变的属性的代码片段。你的程序应该做什么,而不是显示代码片段?该项目的总体工作是什么?该JPanel的具体工作是什么?如果你能给我们提供更多的信息,我们才能做出决定。与手头的问题无关:不要打电话给setXXSize evers,这是否意味着我宁愿做一个removeAll;然后设置组件;而不是使用重新验证和重新绘制?否。如果您修改组件中的文本,它应该在不调用重新绘制的情况下显示。修改组件布局时,通常需要重新验证。对此不确定-请参阅我的回答,这是否意味着我更愿意进行重新验证;然后设置组件;而不是使用重新验证和重新绘制?否。如果您修改组件中的文本,它应该在不调用重新绘制的情况下显示。修改组件布局时,通常需要重新验证。对此不确定-请参阅我的答案两个答案都有效,1+投票。我认为这取决于重新创建GUI组件的成本。两个答案都是有效的,1+投票。我认为这取决于重新创建GUI组件的成本。