Я работаю над сложной частью работы для моего проекта 3-го уровня в университете, около 90% из них идет очень хорошо, но я продолжаю сталкиваться с подобной проблемой на протяжении всего проекта.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я обновляю представление программно, обновление не всегда видно сразу. Я пытался решить эту проблему несколькими способами: вызывать перерисовку, перерисовку, перекрашивание, doLayout, валидацию, повторную валидацию и т. Д. В различных комбинациях и порядках, чтобы попытаться заставить его работать, а иногда - нет, иногда - нет , Я обнаружил, что валидация работает большую часть времени.
Проблема, над которой я в данный момент застрял (и которая была в течение нескольких дней), касается представления, которое мне нужно, чтобы перечислять данные в стиле редактора свойств (например, инспектор свойств netbeans / jdeveloper). Все метки для свойств могут иметь разную ширину (но одинаковую высоту), а сами редактируемые поля обычно имеют одинаковую ширину, но разную высоту (текстовый редактор, раскрывающийся список, выбранный цвет и т. Д.). По этой причине я решил использовать GroupLayout, потребовалось некоторое обучение, чтобы сделать это правильно, но сейчас это так. То есть, когда я первоначально запускаю проект, он отображается правильно, однако, когда я выбираю другой компонент для просмотра (который должен обновить средство просмотра свойств), изначально ничего не происходит. Когда я изменяю размер представления, все старые поля исчезают, и новые не возвращаются.
Изначально я просто поместил это представление на экран, но затем изменил на использование JScrollPane, чтобы учесть большие списки свойств. Я думаю, что в этот момент все пошло не так, но я не понимаю, как это сделать.
Мой вопрос двоякий: каковы верные способы заставить представление обновляться при программном изменении (эффективный - это хорошо, но в этот момент важнее надежность). Здесь я бы с радостью взял ссылку где-нибудь в документации Java, которая объясняет это ясно.
Вторая часть относится к следующему разделу кода (метод setSubject моего средства просмотра свойств). Может кто-нибудь сказать мне, почему это не работает, потому что я не могу придумать, что еще делать.
Iterator<PropertyField> i = propertyFields.iterator();
while(i.hasNext()){
PropertyField p = i.next();
layout.removeLayoutComponent(p.getComponent());
layout.removeLayoutComponent(p.getLabel());
panel.remove(p.getComponent());
panel.remove(p.getLabel());
}
propertyFields.clear();
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
panel.setLayout(layout);
layout = new GroupLayout(panel);
if(this.subject != null){
this.subject.removeObserver(this);
}
ParallelGroup labelsVertical = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
ParallelGroup editsVertical = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
SequentialGroup rows = layout.createSequentialGroup();
this.subject = subject;
if(subject != null){
this.subject.addObserver(this);
ArrayList<Property> props = subject.getProperties();
Iterator<Property>properties = props.iterator();
this.removeAll();
while(properties.hasNext()){
Property p = properties.next();
PropertyField pf = PropertyFieldFactory.getPropertyField(p, this);
pf.setValue(subject.getValue(p.getName()));
propertyFields.add(pf);
labelsVertical.addComponent(pf.getLabel());
editsVertical.addComponent(pf.getComponent());
rows.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(pf.getLabel()).addComponent(pf.getComponent()));
}
layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(labelsVertical).addGroup(editsVertical));
layout.setVerticalGroup(rows);
};
layout.invalidateLayout(panel);
layout.layoutContainer(panel);
panel.setBounds(0,0, panel.getSize().width, panel.getSize().height);
panel.setPreferredSize(panel.getSize());
scroller.getViewport().setViewSize(panel.getSize());
panel.validate();
Я немного изменил код, пытаясь свести к минимуму места, где может возникнуть эта ошибка.