2

JMapViewer を使用して、コンポーネントの奇妙な動作が認識されました。DefaultMapController を使用して地図の位置 (緯度、経度) を取得しています。

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import org.openstreetmap.gui.jmapviewer.DefaultMapController;
import org.openstreetmap.gui.jmapviewer.JMapViewer;

public class Test extends JMapViewer{

public Test() 
{
    addMouseListener(new DefaultMapController(this) {
            public void mouseClicked(MouseEvent e){
            Point  start = e.getPoint();
            System.out.println(e.getPoint());
            }            
       });
  }

protected void paintComponent(Graphics g){super.paintComponent(g);}  

public static void main (String [] args){
            JFrame jf = new JFrame();
            jf.setSize(800, 600);
            Test t= new Test();
            jf.add(t);
            jf.setVisible(true);
    }
}

コードを実行すると、マウスの左ボタンが押された後、メソッド mouseClicked() が複数回 (2x) 呼び出されます。交換後

    addMouseListener(new DefaultMapController(this) {

    addMouseListener(new MouseAdapter() {

コードは正しく機能し、メソッドは 1 回だけ呼び出されます。問題はどこだ?ライブラリ内のバグですか、それとも構文が間違っているか安全ではありませんか? この問題を回避するには?ご協力いただきありがとうございます。

4

1 に答える 1

3

extends 、インスタンス初期化ブロックに a を追加しTestます。結果として、「デフォルトのコンストラクターは、スーパークラスの引数なしのコンストラクターを呼び出します」。スーパークラス は、ご想像のとおり、2回目の追加を行います。JMapViewerMouseListenerJMapControllerMouseListener

public JMapController(JMapViewer map) {
    this.map = map;
    if (this instanceof MouseListener)
        map.addMouseListener((MouseListener) this);
    …
}

代わりに、ここに示すように新しいJMapControllerまたはを作成し、それを使用して を構築します。DefaultMapControllerJMapViewer

import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import org.openstreetmap.gui.jmapviewer.DefaultMapController;
import org.openstreetmap.gui.jmapviewer.JMapViewer;

/**
 * @see https://stackoverflow.com/a/39461854/230513
 */
public class TestMapController {

    private void display() {
        JFrame f = new JFrame("TestMapController");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMapViewer map = new JMapViewer();
        new DefaultMapController(map) {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(e.getPoint());
            }
        };
        f.add(map);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new TestMapController()::display);
    }
}
于 2016-09-13T03:38:30.677 に答える