簡単なrepaint()を使用できますか?その利点は、複数の呼び出しが1つにマージされることです。
(詳細を追加)
GPSの位置を常に更新し、2つのテキストフィールドに表示しているとします。更新を行うためのスレッド:
run() {
while (keepGoing) {
Point myLocation = computeMyLocation();
locationModel.setLocation(myLocation);
locationComponent.repaint();
}
}
次に、MyLocationComponentで
@Override
public void paintComponent(Graphics g) {
Point myLocation = locationModel.getLocation();
// you'd really want a NumberFormat
latitudeTextArea.setText(String.valueOf(myLocation.y));
longitudeTextArea.setText(String.valueOf(myLocation.x));
super.paintComponent(g);
}
利点は、これによりモデルがビューから分割され(スレッドをコントローラーと考える場合、これはMVCです)、すべてのスレッドが機能する必要があることです。invokeLater()は必要ありません。欠点の1つは、スレッドが更新する必要のあるすべてのJComponentを認識している必要があることです。「実際の」シナリオでは、「コントローラー」(スレッド)またはモデルのいずれかから、再描画をトリガーするリスナーにイベントを発生させる可能性があります。
注:@trashgodが指摘しているように、LocationModelでは、更新がすぐに表示されるように、メソッドgetLocation()
とsetLocation()
メソッドを指定する必要があります。synchronized