2016-09-12 11 views
2

JMapViewerを使用すると、コンポーネントの異常な動作が認識されました。私はマップの位置(緯度、経度)を取得するDefaultMapControllerを使用しています。JMapViewer、MouseListenerが2回呼び出されました

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()が複数回呼び出されます(2倍)。

addMouseListener(new MouseAdapter() { 

コードが正しく機能して交換

addMouseListener(new DefaultMapController(this) { 

した後、この方法は、唯一の1x呼び出されます。問題はどこだ?それはライブラリ内のバグですか?構文が間違っているか危険ですか?この問題を回避するには?ご協力いただきありがとうございます。

答えて

3

Testは、JMapViewerを拡張し、instance initializerブロックにMouseListenerを追加します。 consequenceとして、 "デフォルトコンストラクタはスーパークラスの引数なしコンストラクタを呼び出します。"スーパークラスJMapControllerは、MouseListenerを推測しています。第2回時間です。

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

代わりに、hereを示すように、新しいJMapControllerまたはDefaultMapControllerを作成し、あなたの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); 
    } 
} 
+1

@ trashgod:ご説明いただきありがとうございます。いつものように優秀:-) – justik

関連する問題