0

本当に私を驚かせる問題があります。そのため、マップ (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;
    }
}
4

2 に答える 2

0

ここでタイミングの問題が発生する可能性があると思います。MainViewクラスのどこかからルートをロードし、ロードした後に設定するようです。MapViewロードが完了する前に を塗装すると、ルートは になりますnull

于 2012-12-18T19:22:20.450 に答える
0

ここに完全なコードを入れてもらえますか?

以下の呼び出しのような呼び出しはコンパイル エラーを引き起こすため、それ以上のことが必要です。

  • ファイル _routeFile = RouteControl.getInstance().getRouteFile(comboRoute.getSelectedItem().toString());
  • ルート _route = RouteControl.getInstance().loadRoute(_routeFile);

障害のあるシングルトン配線に関する私の最初の推測は、クラスローディングの問題です。シングルトン オブジェクトが物理的に同じかどうかを確認してください。

于 2012-12-21T12:46:56.617 に答える