本当に私を驚かせる問題があります。そのため、マップ (JComponent である MapView) を表示する MainView があります。MapView クラスでは、paintComponent(Graphics g) をオーバーライドしてカスタム要素を描画します。これまでのところ正常に動作します。
また、setRoute で設定し、getRoute で取得できるローカル変数 Route を持つ RouteControl シングルトン クラスもあります。今面白い部分:
MapView paintComponent で RouteControl インスタンスが取得されると、Route は常に null になります。しかし、MainView でルートを設定しました。設定後にルートを取得すると、null ではありません。
マルチスレッドなど、ここで重要なポイントを見逃していますか? また、機能する get/setMap を備えたシングルトン クラス MapControl もあります。
投影するコード:
public class MainView extends javax.swing.JFrame {
private static MainView instance;
private void comboRouteActionPerformed(java.awt.event.ActionEvent evt) {
File _routeFile = RouteControl.getInstance().getRouteFile(comboRoute.getSelectedItem().toString());
Route _route = RouteControl.getInstance().loadRoute(_routeFile);
RouteControl.getInstance().setRoute(_route);
// if we retrieve the route here it works
}
}
今度は MapView:JComponent:
public class MapView extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// this nicely works, also set in the MainView!
if(MapControl.getInstance().getMap() != null) {
BufferedImage mapImage = MapControl.getInstance().getMap().getMapImage();
g.drawImage(mapImage, 0, 0, null);
// draw le route THIS IS ALWAYS NULL
if(RouteControl.getInstance().getRoute() != null) {
g.setColor(Color.red);
g.fillRect(40, 40, 15, 15);
}
else {
System.out.println("**** route is null");
}
}
}
}
ルート制御:
public class RouteControl {
private static RouteControl instance;
private Route route;
public static synchronized RouteControl getInstance() {
if (instance == null) {
instance = new RouteControl();
}
return instance;
}
public Route getRoute() {
return route;
}
public void setRoute(Route route) {
System.out.println("RouteControl:setRoute");
this.route = route;
}
}