如何根据新数据获取自定义绘制组件?

时间:2015-05-31 09:57:24

标签: java swing user-interface graphics java-2d

我正在使用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);
}

每次用户点击地图上的某个点时,如何调用此绘制方法?还有其他选择吗? 谢谢您的时间:))

1 个答案:

答案 0 :(得分:0)

尝试在JFrame上调用validate()和repaint()方法来重绘组件。

frame.getContentPane().validate();
frame.getContentPane().repaint();