0

我正在为我在大学的 3 级项目做一项复杂的工作,其中大约 90% 进展顺利,但我在整个项目中不断遇到类似的问题。

我遇到的问题是,当我以编程方式更新视图时,更新并不总是立即可见。我尝试了许多不同的方法来解决这个问题,以不同的组合和顺序调用 redraw、repaint、repaintImediately、doLayout、validate、revalidate 等,以尝试使其工作,有时会,有时不会. 我发现 validate 大多数时候都有效。

我目前遇到的问题(并且已经持续了几天)是关于我需要以属性编辑器的样式列出数据的视图(想想 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();

我已经稍微更改了代码,试图尽量减少可能发生此错误的地方。

4

0 回答 0