0

有一个问题真的让我很害怕。所以我们有一个 MainView,它在上面显示一个地图(MapView,它是一个 JComponent)。在 MapView 类中,我们覆盖了paintComponent(Graphics g) 来绘制我们的自定义内容。到目前为止工作正常。

我们还有一个 RouteControl 单例类,其中有一个局部变量 Route,我们可以使用 setRoute 设置它并使用 getRoute 检索。现在有趣的部分:

当在我们的 MapView paintComponent 中检索 RouteControl 实例时,Route 始终为空。但是我们在 MainView 中设置了一个路由,如果我们在设置后检索该路由,则它不为空。

我在这里错过了一个关键点,比如多线程吗?我还有一个带有 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 回答