当前位置: 首页 > 面试题库 >

JMapViewer,MouseListener调用了2次

上官琦
2023-03-14
问题内容

使用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() {

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


问题答案:

您的Testextensions
JMapViewerMouseListener在实例初始化程序块中添加了一个。作为一个结果,“默认构造函数会调用父类的无参数的构造。”
超类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);
    }
}


 类似资料:
  • 使用JMapViewer时,发现了组件的一种奇怪行为。我正在使用DefaultMapController获取映射位置(lat,lon)。 与 代码工作正常,方法只调用1x。问题出在哪里?是库内的bug,还是语法错误或不安全?如何避免这个问题?谢谢你的帮助。

  • 处理MouseEvent的类应该实现此接口。该类的对象必须在组件中注册。 可以使用addMouseListener()方法注册该对象。 接口声明 以下是java.awt.event.MouseListener接口的声明: public interface MouseListener extends EventListener 接口方法 (Interface methods) SN 方法和描

  • 处理MouseEvent的类应该实现此接口。 该类的对象必须在组件中注册。 可以使用addMouseListener()方法注册该对象。 接口声明 (Interface Declaration) 以下是java.awt.event.MouseListener接口的声明 - public interface MouseListener extends EventListener 接口方法 S

  • 问题内容: 我有一堆JLabel,我想捕获鼠标单击事件。目前我必须使用: 我想知道是否有一种比较整齐的方法来代替一堆我不希望陷井的事件? 编辑: 上面的作品,但netBeans说添加@override注释。这是什么意思? 编辑:确定。解决并解决。 问题答案: 用 用于接收鼠标事件的抽象适配器类。此类中的方法为空。此类的存在是为了方便创建侦听器对象。因此,您只需要实现自己喜欢的方法,例如以下示例:

  • 若要避免鼠标监听器的双重调用,请参见问题 JMapViewer,MouseListener调用2次 该类不是直接从JMapViewer派生的。通过鼠标单击,我得到了两个坐标[lat,lon],它们将用于绘制由P1,P2给出的一条线,其中P1=[lat,lon],P2=[lat+10,lon+10]。 当前版本不能很好地工作,没有调用paintComponent()... 谢谢你的帮助。

  • 问题内容: 我正在做一个涉及JPanel中的鼠标和键监听器的小项目。不幸的是,当我使用鼠标/键盘时,没有一个方法被调用。我之前曾使用过JPanels / JFrame / JApplet和JComponents。代码片段如下所示: 偏离主题:我不断收到错误消息您的帖子似乎包含格式错误的代码。请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具