Java 从绘制了某些内容的框架中获取鼠标单击的坐标

Java 从绘制了某些内容的框架中获取鼠标单击的坐标,java,map,mouselistener,Java,Map,Mouselistener,我的基本问题是,我有一个内部框架,里面有一张地图。我想得到地图上点击的坐标,这样我就可以画一个指向地图的航路点。但基本上我得到的是什么都没有。getX和getY仅在我单击地图外部的某个位置(内部框架)时返回坐标。 手动添加航路点工作正常。 这是我的密码: package gui; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLayer; import javax.swing.JMenuB

我的基本问题是,我有一个内部框架,里面有一张地图。我想得到地图上点击的坐标,这样我就可以画一个指向地图的航路点。但基本上我得到的是什么都没有。getX和getY仅在我单击地图外部的某个位置(内部框架)时返回坐标。 手动添加航路点工作正常。 这是我的密码:

package gui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.CardLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;

import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.FlowLayout;
import javax.swing.border.EtchedBorder;
import javax.swing.plaf.LayerUI;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import org.eclipse.wb.swing.FocusTraversalOnArray;
import org.jdesktop.swingx.mapviewer.GeoPosition;


import soft.MapDrawer;
import soft.MapView;


import java.awt.Component;
import javax.swing.JToggleButton;
import javax.swing.JRadioButton;
import javax.swing.JInternalFrame;
import java.awt.Canvas;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.awt.Dimension;
import javax.swing.JLayeredPane;
import javax.swing.JLabel;
import java.awt.Color;
import javax.swing.ImageIcon;
import javax.swing.Box;

public class MainWindow {

    private JFrame frame;
    private JMenu MenuBasicActions;
    private JInternalFrame mapFrameRef;
    private MapDrawer mapD;
    private MapView hlavnaMapa; 


    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {


        EventQueue.invokeLater(new Runnable()

        {
            public void run() 
            {
                try 
                {
                    MainWindow window = new MainWindow();
                    window.frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });

    }

    /**
     * Create the application.
     */
    public MainWindow()
    {
        initialize();   

    }

    public JFrame getMainFrame()
    {
        return frame;
    }


    public JInternalFrame getMapFrame()
    {
        return mapFrameRef; 
    }







    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setVisible(true);
        frame.setBounds(100, 100, 1024, 768);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JMenuBar menuBarUpper = new JMenuBar();
        frame.setJMenuBar(menuBarUpper);

        MenuBasicActions = new JMenu("GPS Settings");
        menuBarUpper.add(MenuBasicActions);

        JMenuItem mntmNewMenuItem = new JMenuItem("New menu item");
        MenuBasicActions.add(mntmNewMenuItem);

        JMenuItem mntmNewMenuItem_1 = new JMenuItem("New menu item");
        MenuBasicActions.add(mntmNewMenuItem_1);

        JMenuItem mntmNewMenuItem_2 = new JMenuItem("New menu item");
        MenuBasicActions.add(mntmNewMenuItem_2);

        JMenu DevicesMenu = new JMenu("Devices");
        menuBarUpper.add(DevicesMenu);

        JMenuItem mntmNewMenuItem_3 = new JMenuItem("New menu item");
        DevicesMenu.add(mntmNewMenuItem_3);

        JMenuItem mntmNewMenuItem_4 = new JMenuItem("New menu item");
        DevicesMenu.add(mntmNewMenuItem_4);

        JMenu HelpMenu = new JMenu("Help");
        menuBarUpper.add(HelpMenu);



        JToolBar toolBar = new JToolBar();
        toolBar.setOrientation(SwingConstants.VERTICAL);
        frame.getContentPane().add(toolBar, BorderLayout.WEST);

        JButton btnNewButton_1 = new JButton("New button");
        btnNewButton_1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {

            }
        });
        toolBar.add(btnNewButton_1);


        JButton btnNewButton = new JButton("New button");
        toolBar.add(btnNewButton);

        JButton btnNewButton_2 = new JButton("New button");
        toolBar.add(btnNewButton_2);

        JButton btnNewButton_3 = new JButton("New button");
        toolBar.add(btnNewButton_3);
        toolBar.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{btnNewButton_1, btnNewButton}));

        JInternalFrame mapInternalFrame = new JInternalFrame("New JInternalFrame");
        mapFrameRef=mapInternalFrame;
        mapInternalFrame.getGlassPane();
        frame.getContentPane().add(mapInternalFrame, BorderLayout.CENTER);
        mapInternalFrame.setVisible(true);
        //mapFrame.getContentPane().add(drawPanel, BorderLayout.CENTER);

        frame.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{frame.getContentPane(), toolBar, btnNewButton_1, btnNewButton, btnNewButton_2, btnNewButton_3, menuBarUpper, MenuBasicActions, mntmNewMenuItem, mntmNewMenuItem_1, mntmNewMenuItem_2, DevicesMenu, mntmNewMenuItem_3, mntmNewMenuItem_4, HelpMenu}));
        /*Vlastny kod                               */      


        hlavnaMapa=new MapView();
        hlavnaMapa.Init(mapInternalFrame);



        DrawerEventHandler handler=new DrawerEventHandler();
        mapInternalFrame.addMouseListener(handler);
        mapInternalFrame.addMouseMotionListener(handler);
    }

      public class DrawerEventHandler implements MouseListener, MouseMotionListener
        {

            @Override
            public void mouseDragged(MouseEvent event)
            {


            }

            @Override
            public void mouseMoved(MouseEvent event) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent event) 
            {
                mapD=new MapDrawer(hlavnaMapa.getMap());
                Point2D point=new Point2D.Double(event.getX(),event.getY());
                mapD.addWaypoint(mapD.pointToGeo(point));
                System.err.println(event.getX()+"  "+event.getY());


            }

            @Override
            public void mouseEntered(MouseEvent event) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent event) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent event) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseReleased(MouseEvent event) {
                // TODO Auto-generated method stub

            }

        } 

}
MapDrawer类:

package soft;



import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;

import org.jdesktop.swingx.JXMapKit;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.mapviewer.GeoPosition;
import org.jdesktop.swingx.mapviewer.TileFactoryInfo;
import org.jdesktop.swingx.mapviewer.Waypoint;
import org.jdesktop.swingx.mapviewer.WaypointPainter;
import org.jdesktop.swingx.mapviewer.util.GeoUtil;


public class MapDrawer 
{

    private JXMapViewer view;
    private JXMapKit mapRef;
    private Set waypoints;
    //private BufferedImage img;
     //img = ImageIO.read(new File("D://workspace//GPS Admin Software//resources//iconPerson.jpg"));

    public MapDrawer(JXMapKit mapa)
    {
        mapRef=mapa;
        waypoints = new HashSet();
    }

    public Point2D geoToPoint(GeoPosition pos)
    {
        return view.convertGeoPositionToPoint(pos);
    }

    public GeoPosition pointToGeo(Point2D point)
    {
        return view.convertPointToGeoPosition(point);
    }


        public void addWaypoint(GeoPosition geo) {
            //create a Set of waypoints



            waypoints.add(new Waypoint(geo.getLatitude(),geo.getLongitude()));

            //create a WaypointPainter to draw the points
            WaypointPainter painter = new WaypointPainter();
            painter.setWaypoints(waypoints);
            mapRef.getMainMap().setOverlayPainter(painter);
        }


}
MapViewer类

package soft;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JLayeredPane;

import org.jdesktop.swingx.JXMapKit;



public class MapView 
{
    private JXMapKit map;

    public MapView()
    {

        map=new JXMapKit();
        map.setDefaultProvider(org.jdesktop.swingx.JXMapKit.DefaultProviders.OpenStreetMaps);
        map.setDataProviderCreditShown(true);
    }

    public void Init(JInternalFrame container)
    {
        container.add(map);

    }

    public JXMapKit getMap()
    {
        return map;
    }




}

这听起来像是
JXMapKit
在鼠标事件到达内部帧之前就在消耗它们

把鼠标事件想象成雨滴,鼠标倾听就像雨伞。如果你头顶上的伞被打开,那么雨滴就不会落到你身上


您需要将鼠标侦听器添加到
JXMapKit
实例中,而不是将其添加到内部框架中。我将其添加到JXMapKit中,经过几个小时的尝试,终于找到了一个解决方案,但什么都没有发生;我必须这样做>hlavnaMapa.getMap().getMainMap().addMouseListener(处理程序)。我觉得我的想法很好,MouseListener无法从动态内容中生成点击。最后,点击效果很好