私は大学でレベル 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();
このエラーが発生する可能性のある場所を最小限に抑えるために、コードを少し変更しました。