我正在使用netbeans 8.0在Java GUI中开发应用程序/游戏。在这个游戏中你有一个非常简单的U.I.这是意大利半岛的标签内的地图(GIF图像),一个开始按钮和几个调试标签。
在这个游戏中,您拥有意大利最大城市的所有坐标(纬度和经度),当有人点击开始按钮时,城市将被随机提取,因此城市名称将显示在标签和用户中必须猜测那个城市的位置。现在我解决了地理坐标和像素之间的所有铸件,我让数据模型正常工作,所以你不必担心所有这些。
当用户点击地图猜测城市的位置时,我想用红点标记城市的正确位置,这里有我所有的问题...我会发布一些代码来更清楚;)
private void lbMappaMouseClicked(java.awt.event.MouseEvent evt) {
//gets the pixels coordinates of the user click
mouseX = evt.getX();
mouseY = evt.getY();
//casting datas for coordinates
double cLon = 12.565006;
double cLat = 42.094436;
double w = 6.626604;
double e = 18.520248;
double n = 47.091932;
double s = 36.646879;
double kLat = 0.97;
double kLon = 1;
//earth radius
double R = 6371;
//formula to convert the coordinates of the click to geographical lon,
double mouseLon = cLon + (mouseX - dimX / 2) * (e - cLon) / kLon / dimX * 2;
//formula to convert the coordinates of the click to geo lat
double mouseLat = cLat + (mouseY - dimY / 2) * (s - cLat) / kLat / dimY * 2;
//this is the formula to find the pixel coordinates of the extracted city
comuneX = (int) (((longitudine - cLon) / (e - cLon) / kLon / dimX * 2) + dimX / 2);
comuneY = (int) (((latitudine - cLat) / (s - cLat) / kLat / dimY * 2) + dimY / 2);
//EVERY TIME I CALCULATE THIS STUFF ABOVE I WANTED TO DRAW A RED DOT/OVAL ON THE MAP
double lonA = Math.toRadians(mouseLon);
double latA = Math.toRadians(mouseLat);
double lonB = Math.toRadians(longitudine);
double latB = Math.toRadians(latitudine);
double distanza = R * Math.acos(Math.sin(latA) * Math.sin(latB) + Math.cos(latA) * Math.cos(latB) * Math.cos(lonA - lonB));
lonA = Math.toRadians(e);
latA = Math.toRadians(n);
lonB = Math.toRadians(w);
latB = Math.toRadians(s);
//distance between the correct position of the city and the user click
double distanzaMax = R * Math.acos(Math.sin(latA) * Math.sin(latB) + Math.cos(latA) * Math.cos(latB) * Math.cos(lonA - lonB));
lbDistanza.setText(Double.toString(distanza));
}
我的类扩展了JFrame,我试图覆盖paint方法,但我发现它只在程序第一次呈现地图时才有效。
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.RED);
g.fillOval(comuneX, comuneY, comuneX, comuneY);
}
每次用户点击地图上的某个点时,如何调用此绘制方法?还有其他选择吗? 谢谢您的时间:))
答案 0 :(得分:0)
尝试在JFrame上调用validate()和repaint()方法来重绘组件。
frame.getContentPane().validate();
frame.getContentPane().repaint();