Java Swing - Jpanel не перерисовывает / перерисовывает себя - PullRequest
1 голос
/ 18 марта 2012

Я использую JPanel со свойством propertyChangeListener и хочу, чтобы он перерисовывал себя в зависимости от того, какая конкретная переменная 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, я вижу, что всякий раз, когда есть изменение в model, оно запускает вызов propertyChange, и оно также переходит на revalidate и repaint, но только JPanel дисплей остается прежним. Похоже, он не рендерится сам. Что-нибудь фундаментальное, что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

Пример фрагмента свойства, которое я изменяю, выглядит следующим образом -

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);
    }

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Непонятно, как вы меняете компоненты на панели. Если панель не обновляется, то перекраска / повторная проверка не будет иметь никакого эффекта. Я думаю, что вам не нужно повторно вызывать / перекрашивать, чтобы вызываться явно, если вы не изменяете способ размещения компонентов. JButton.setText должен, например, изменить метку кнопки без необходимости вызова repaint.

2 голосов
/ 19 марта 2012

Чтобы расширить ответ AKJ выше, я думаю, что вы должны восстанавливать свои компоненты при изменении свойства.Поэтому удаление всего, а затем чтение - это один из способов сделать это.Как только вы это заработаете, вы можете более избирательно относиться к загрузке обновления модели в графический интерфейс, например, если добавлена ​​новая запись, просто добавьте новый компонент, чтобы отразить это.Удалить все / readd хорошо для многих случаев, хотя.НТН.

...