Обновление представления Java - PullRequest
0 голосов
/ 04 марта 2012

Я работаю над сложной частью работы для моего проекта 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();

Я немного изменил код, пытаясь свести к минимуму места, где может возникнуть эта ошибка.

...