Java swing——Jpanel 不重新渲染/重绘自身

标签 java swing user-interface jpanel repaint

我正在使用带有 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 并且它还会运行 revalidaterepaint 但只有 JPanel 显示保持不变。它似乎并没有重新渲染自己。 我在这里缺少什么基本知识吗?

编辑:

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

labelMacroModel.addMacroModel(addedMacroModel);

其中 labelMacroModelLabelMacroModel 类型,addedMacroModelMacro 类型

现在触发属性更改的 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/

相关文章:

java - swing 中内容 Pane 和布局之间的区别?

java - 何时使用 JFrame 或 JPanel

c - 检测 GtkTreeView 行的鼠标移出

Java 图像编辑器 UI 组件

java - Hibernate,在计数中使用具有多个列的不同

java - 如何在 Android 的 Fragment 中使用 'bundle' 而不是 'intent.putExtra()'

JAVA + Flex 应用程序在尝试将大量数据导出到 .CSV 后崩溃

java - 使用 UTF-16 内容解码 xml 如何从 xml 文件底部删除特殊字符

java - 任何现有的java库可以在Jmenu中用swing删除、编辑、添加文件中的某些行?

c++ - 如何在 Qt 中将项目添加到布局中?