0

私は大学でレベル 3 プロジェクトの複雑な作業に取り組んでおり、その約 90% は非常にうまくいっていますが、プロジェクト全体で同様の問題が発生し続けています。

私が得ている問題は、プログラムでビューを更新すると、更新がすぐに表示されないことがあるということです。私はこれを解決するためにさまざまなことを試しました.redraw、repaint、repaintImediately、doLayout、validate、revalidateなどをさまざまな組み合わせと順序で呼び出して、動作させるようにしましたが、動作する場合もあれば、動作しない場合もあります. ほとんどの場合、検証が機能することがわかりました。

私が現在立ち往生している(そして数日間続いている)問題は、プロパティエディター(netbeans/jdeveloperプロパティインスペクターを考えてください)のスタイルでデータをリストする必要があるビューに関するものです。プロパティのラベルはすべて異なる幅 (ただし高さは同じ) にすることができ、編集可能なフィールド自体は通常、幅は同じですが高さが異なります (テキスト エディター、ドロップダウン、カラー ピッカーなど)。このため、私は GroupLayout を使用することにしました。それを正しく理解するには多少の学習が必要でしたが、今ではそうです。つまり、最初にプロジェクトを実行すると正しく表示されますが、表示する別のコンポーネントを選択すると (プロパティ ビューアが更新されるはずです)、最初は何も起こりません。ビューのサイズを変更すると、古いフィールドがすべて消え、新しいフィールドが戻ってきません。

最初はこのビューを画面に配置しただけでしたが、その後 JScrollPane を使用するように変更して、プロパティのより大きなリストを許可しました。これが問題が発生し始めたポイントだと思いますが、どうすればよいかわかりません。

私の質問は 2 つあります。プログラムで変更されたときにビューを強制的に更新する確実な方法は何ですか (効率的であることは良いことですが、現時点では信頼性がより重要です)。ここで、それを明確に説明しているJavaドキュメントのどこかに喜んでリンクします。

2 番目の部分は、コードの次のセクション (プロパティ ビューアーの 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