JMapViewer, mousellistener被调用2次



使用JMapViewer时,发现了组件的一个奇怪行为。我使用DefaultMapController来获取地图位置(lat, lon)。

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);
    }
}

运行代码,在按下鼠标左键后,方法mouseclick()被调用多次(2x)。更换后

    addMouseListener(new DefaultMapController(this) {

    addMouseListener(new MouseAdapter() {

代码工作正常,方法只被调用1x。问题在哪里?是库内部的错误还是语法错误或不安全?如何避免这个问题?谢谢你的帮助。

您的Test扩展了JMapViewer,在实例初始化块中添加了MouseListener。因此,"默认构造函数将调用父类的无参数构造函数"。超类JMapController为您的MouseListener(您猜对了)添加了时间。

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

相反,创建一个新的JMapControllerDefaultMapController,如图所示,并使用它来构建您的JMapViewer

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);
    }
}

相关内容

  • 没有找到相关文章

最新更新