我有一个Swing应用程序,在地图上有一个玻璃窗格。
它在某些位置绘制点。当我点击地图上的某个地方时,玻璃窗格收到消息CONTROLLER_NEW_POLYGON_MARK
我
想要在事件数据中指定的位置显示一个额外的点(参见MyGlassPane.propertyChange
)。
玻璃窗格类名为MyGlassPane
。使用调试器,我验证了addPointToMark
中实际调用了propertyChange
。
但屏幕上不会出现其他点。
如何更改代码,以便在触发事件(PointSetMarkingGlassPane.paintComponent
)时调用IEventBus.CONTROLLER_NEW_POLYGON_MARK
?
public class PointSetMarkingGlassPane extends JComponent implements IGlassPane {
private final ILatLongToScreenCoordinatesConverter latLongToScreenCoordinatesConverter;
private final List<Point.Double> pointsToMark = new LinkedList<Point.Double>();
public PointSetMarkingGlassPane(final ILatLongToScreenCoordinatesConverter aConverter) {
this.latLongToScreenCoordinatesConverter = aConverter;
}
protected void addPointToMark(final Point.Double aPoint)
{
if (aPoint != null)
{
pointsToMark.add(aPoint);
}
}
@Override
protected void paintComponent(final Graphics aGraphics) {
for (final Point.Double pointToMark : pointsToMark)
{
final Point positionInScreenCoords = latLongToScreenCoordinatesConverter.getScreenCoordinates(pointToMark);
drawCircle(aGraphics, positionInScreenCoords, Color.red);
}
}
private void drawCircle(Graphics g, Point point, Color color) {
g.setColor(color);
g.fillOval(point.x, point.y, 10, 10);
}
}
public class MyGlassPane extends PointSetMarkingGlassPane implements PropertyChangeListener {
public MyGlassPane(ILatLongToScreenCoordinatesConverter aConverter) {
super(aConverter);
addPointToMark(DemoGlassPane.ARTYOM);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (IEventBus.CONTROLLER_NEW_POLYGON_MARK.equals(evt.getPropertyName()))
{
addPointToMark((Point.Double)evt.getNewValue());
invalidate();
}
}
}
答案 0 :(得分:1)
我认为invalidate()
仅标记您的组件以检查大小和布局。您应该致电repaint()
重新绘制窗格。
另外,我想知道为什么使用propertyChangeListener进行鼠标点击。我更喜欢简单的鼠标监听器+ MouseAdapter和MouseEvent x,y,按钮状态。
答案 1 :(得分:0)
invalidate()
可能无法帮助您,因为它标记了布局更改的组件,而不是绘制更改。为什么不拨打repaint()
呢?
为了获得更好的性能,您可以调用repaint
方法,该方法采用矩形(或表示矩形的四个整数),以便仅重新绘制新添加的点;我建议将addPointToMark
的返回类型从void更改为java.awt.Point,并让它返回latLongToScreenCoordinatesConverter.getScreenCoordinates
的结果,因此MyGlassPane可以从该Point派生一个矩形,然后可以将其传递给重绘方法。