Java 如何使自定义绘制的组件根据新数据进行更改?

Java 如何使自定义绘制的组件根据新数据进行更改?,java,swing,user-interface,graphics,java-2d,Java,Swing,User Interface,Graphics,Java 2d,我正在使用netbeans 8.0在Java GUI中开发一个应用程序/游戏。在这个游戏中,你有一个非常简单的U.I.,它是一个标签内的意大利半岛地图(GIF图像),一个开始按钮和一些用于调试的标签 在这个游戏中,你拥有意大利最大城市的所有坐标(纬度和经度),当有人单击开始按钮时,城市将被随机抽取,因此城市名称将出现在标签中,用户必须猜测该城市的位置。现在,我解决了地理坐标和像素之间的所有转换,数据模型工作正常,因此您不必担心所有这些问题 当用户点击地图猜测城市的位置时,我想用一个红点标记城市的

我正在使用netbeans 8.0在Java GUI中开发一个应用程序/游戏。在这个游戏中,你有一个非常简单的U.I.,它是一个标签内的意大利半岛地图(GIF图像),一个开始按钮和一些用于调试的标签

在这个游戏中,你拥有意大利最大城市的所有坐标(纬度和经度),当有人单击开始按钮时,城市将被随机抽取,因此城市名称将出现在标签中,用户必须猜测该城市的位置。现在,我解决了地理坐标和像素之间的所有转换,数据模型工作正常,因此您不必担心所有这些问题

当用户点击地图猜测城市的位置时,我想用一个红点标记城市的正确位置,这里有我所有的问题。。。我将发布一些代码以更清晰;)

我的类扩展了JFrame,我试图重写paint方法,但我发现它只在程序第一次渲染贴图时起作用

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.RED);
    g.fillOval(comuneX, comuneY, comuneX, comuneY);
}
如何在用户每次单击地图上的某个点时调用此绘制方法?还有其他选择吗? 感谢您的时间:)

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

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

您要求组件重新绘制:对于swing组件,您应该覆盖要绘制的特定组件的
paintComponent()
方法,不建议覆盖
paint()
。谢谢@JBNizet这正是我要找的!非常简单,谢谢。但现在我注意到,计算城市位置的公式是错误的D:回去工作。。。如果不重写
paint
,尤其是像
JFrame
这样的顶级容器,它们包含许多子组件,这些子组件可以独立于框架进行绘制(未通知它),这会导致您可能已经绘制的部分内容(如果不是全部)被擦除。使用类似于
JPanel
的工具,覆盖它的
paintComponent
,进行自定义绘制,然后将其添加到帧中。需要时,在该组件上调用
repaint
,请求对其进行更新
validate
。在这种情况下,不太可能需要该组件,因为它依赖于以某种方式失效的布局。据我所知,重新绘制框架将是一个更好的选择,因为OP覆盖了框架的
paint
方法,而内容窗格是框架内的容器,因此您请求绘制错误的组件。话虽如此,OP已经覆盖了框架的
paint
,这一简单事实将导致无休止的问题,因此即使建议也没有那么大的帮助
frame.getContentPane().validate();
frame.getContentPane().repaint();