JMapViewer、MouseListener 调用了 2 次
JMapViewer, MouseListener called 2 times
使用 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 次。问题出在哪里?是库中的错误还是语法错误或不安全?如何避免这个问题?感谢您的帮助。
您的 Test
扩展了 JMapViewer
,在 instance initializer block. As a consequence 中添加了 MouseListener
,"default constructor will call the no-argument constructor of the superclass." 超类 JMapController
添加了您的MouseListener
——你猜对了——秒时间。
public JMapController(JMapViewer map) {
this.map = map;
if (this instanceof MouseListener)
map.addMouseListener((MouseListener) this);
…
}
相反,创建一个新的 JMapController
或 DefaultMapController
,如图 here,并使用它来构建您的 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
*/
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 获取地图位置(纬度、经度)。
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 次。问题出在哪里?是库中的错误还是语法错误或不安全?如何避免这个问题?感谢您的帮助。
您的 Test
扩展了 JMapViewer
,在 instance initializer block. As a consequence 中添加了 MouseListener
,"default constructor will call the no-argument constructor of the superclass." 超类 JMapController
添加了您的MouseListener
——你猜对了——秒时间。
public JMapController(JMapViewer map) {
this.map = map;
if (this instanceof MouseListener)
map.addMouseListener((MouseListener) this);
…
}
相反,创建一个新的 JMapController
或 DefaultMapController
,如图 here,并使用它来构建您的 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
*/
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);
}
}