1

我有一个 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();
        }
    }
}
4

2 回答 2

1

因为我认为invalidate()只标记您的组件以检查大小和布局。你应该打电话repaint()重新粉刷你的窗格。

另外我想知道为什么您使用 propertyChangeListener 进行鼠标单击。我更喜欢简单的鼠标侦听器 + MouseAdapter 和 MouseEvent x, y, 按钮状态。

于 2013-10-14T12:47:04.870 回答
0

invalidate()可能对您没有帮助,因为它标记了布局更改的组件,而不是绘画更改。为什么不打电话repaint()呢?

为了获得更好的性能,您可以调用repaint采用 Rectangle(或表示矩形的四个整数)的方法,以便仅重新绘制新添加的点;我建议将返回类型addPointToMark从 void 更改为 java.awt.Point,并让它返回 的结果latLongToScreenCoordinatesConverter.getScreenCoordinates,因此 MyGlassPane 可以从该 Point 派生一个矩形,然后可以将其传递给 repaint 方法。

于 2013-10-14T12:47:13.020 回答