1

地図の上にガラス板がある Swing アプリがあります。

特定の位置にドットを描画します。マップ上のどこかをクリックすると、ガラス ペインが「CONTROLLER_NEW_POLYGON_MARKI want do」というメッセージを受け取り、イベント データで指定された位置に追加のドットを表示します (「 」を参照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 (または四角形を表す 4 つの int) を受け取るメソッドを呼び出して、新しく追加されたポイントのみが再描画されるようにすることができます。の戻り値の型をaddPointToMarkvoid から java.awt.Point に変更し、 の結果を返すようにすることをお勧めします。これによりlatLongToScreenCoordinatesConverter.getScreenCoordinates、MyGlassPane はその Point から四角形を派生させ、再描画メソッドに渡すことができます。

于 2013-10-14T12:47:13.020 に答える