有一个真正让我烦恼的问题。 所以我们有一个MainView,它显示一个地图(MapView是一个JComponent)。 在MapView类中,我们覆盖paintComponent(Graphics g)来绘制我们的自定义东西。 到目前为止工作正常。
我们还有一个RouteControl单例类,其中包含一个局部变量Route,我们可以使用setRoute设置并使用getRoute进行检索。现在有趣的部分:
在MapView paintComponent中检索RouteControl实例时,Route始终为null。但是我们在MainView中设置了一个路由,如果我们在设置之后检索路由,那么它就不是空的。
我是否会错过这里的关键点,比如多线程?我还有一个单例类MapControl,其get / setMap可以工作。
项目代码:
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");
}
}
}
}
RouteControl:
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;
}
}
答案 0 :(得分:0)
我认为你可能会遇到计时问题。看起来你从MainView
类中的某个地方加载路径并在加载之后设置它。
如果在加载完成之前绘制了MapView
,则路线将为null
。
答案 1 :(得分:0)
你能把完整的代码放在这里吗?
以下调用之类的调用会导致编译错误,因此必须有更多错误。
我对faulthy singleton布线的第一个猜测是类加载问题。请检查单件对象在物理上是否相同。