我正在使用带有 propertyChangeListener 的 JPanel,并希望它根据特定变量 model
更改时重新呈现自身。我的代码如下 --
public class LabelMacroEditor extends JPanel implements PropertyChangeListener {
private static final long serialVersionUID = 1L;
private LabelMacroModel model;
public LabelMacroEditor(LabelMacroModel bean) {
this.model = bean;
model.addPropertyChangeListener(this);
setupComponents();
validate();
setVisible(true);
}
public void setupComponents()
{
Box allButtons = Box.createVerticalBox();
JScrollPane macroModelScroller = new JScrollPane(allButtons);
macroModelScroller.setPreferredSize(new Dimension(300, 200));
for(MacroModel macroModel : model.getMacroModelList())
{
LabelMacroEditorEditableEntity macroEditorEntity = new LabelMacroEditorEditableEntity(macroModel);
Box entityBox = Box.createHorizontalBox();
entityBox.add(macroEditorEntity.getUpButton());
entityBox.add(Box.createHorizontalStrut(15));
entityBox.add(macroEditorEntity.getMacroDetailsButton());
entityBox.add(Box.createHorizontalStrut(15));
entityBox.add(macroEditorEntity.getDownButton());
allButtons.add(entityBox);
}
add(macroModelScroller);
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
revalidate();
repaint();
}
}
当我在 eclipse 中使用 Debug模式时,我可以看到每当 model
发生变化时,它都会触发调用 propertyChange
并且它还会运行 revalidate
和 repaint
但只有 JPanel
显示保持不变。它似乎并没有重新渲染自己。
我在这里缺少什么基本知识吗?
编辑:
属性 im 更改的示例片段如下 --
labelMacroModel.addMacroModel(addedMacroModel);
其中 labelMacroModel
是 LabelMacroModel
类型,addedMacroModel
是 Macro
类型
现在触发属性更改的 LabelMacroModel
类的相关部分如下 --
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 应该更改按钮的标签而不需要调用重绘。
关于Java swing——Jpanel 不重新渲染/重绘自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761005/