【问题标题】:How can I get the location of the mouse pointer in a JPanel (Without any operation of the Mouse)?如何在 JPanel 中获取鼠标指针的位置(无需任何鼠标操作)?
【发布时间】:2014-08-18 18:20:41
【问题描述】:

我可以通过在 JPanel 上添加 MouseAdapter 来获取鼠标指针的位置。但是,它仅在用户移动鼠标指针或进行其他一些操作时才有效。代码在这里:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class LocationTest {
    public static void main(String[] args) {
        LocationTest locationTest = new LocationTest();
        locationTest.createUI();
    }

    public void createUI(){
        JFrame frame = new JFrame("Location Test");
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainPanel mainPanel = new MainPanel();
        mainPanel.addMouseListener(new CustomMouseListener());
        mainPanel.addMouseMotionListener(new CustomMouseListener());
        frame.add(mainPanel,BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @SuppressWarnings("serial")
    class MainPanel extends JPanel{
        @Override
        public Dimension getPreferredSize() {
            // TODO Auto-generated method stub
            return new Dimension(400,300);
        }
    }

    class CustomMouseListener extends MouseAdapter{
        @Override
        public void mouseClicked(MouseEvent e) {
            System.out.println("Click: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }

        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println("Press: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            System.out.println("Release: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            System.out.println("Drag: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            System.out.println("MouseMove: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }
    }
}

是否可以在不使用任何鼠标操作的情况下获取位置?例如,我可以随时使用 panel.getPointerLocation 获取此信息。

提前感谢您的帮助。

【问题讨论】:

    标签: java swing awt


    【解决方案1】:

    使用 MouseInfo.getPointerInfo().getLocation() 随时获取当前鼠标位置。

    【讨论】:

    • 然后问你的框架在哪里?从当前鼠标位置减去你的框架位置......等等瞧
    • 斯特凡。 @马丁弗兰克。感谢您的帮助。
    【解决方案2】:

    定义一个新界面,以便听众可以向面板提供反馈:

    public interface PointHolder {
        /**
         * Pass the new mouse location.
         * Pass null if the mouse left the panel
         */
        public void setPoint(Point newpoint);
    }
    

    让MainPanel实现它:

    public MainPanel extends JPanel implements PointHolder {
        private Point lastpoint;
        @Override
        public void setPoint(Point newpoint) {
            lastpoint=newpoint;
        }
        public Point getPointerLocation() {
            return lastpoint;
        }
    }
    

    向 CustomMouseListener 添加构造函数:

    public CustomMouseListener {
        PointHolder holder;
        public CustomMouseListener(PointHolder holder) {
           this.holder=holder;
        }
    
        @Override
        public void mouseMoved(MouseEvent e) {
            holder.setPoint(e.getPoint());
    
            System.out.println("MouseMove: " + e.getPoint().getX() + " , " + e.getPoint().getY());
        }
    
        @Override
        public void mouseExited(MouseEvent e)
        {
            holder.setPoint(null);
        }
    }
    

    在您的主目录中:

        MainPanel mainPanel = new MainPanel();
        CustomMouseListener listener=new CustomMouseListener(mainPanel);
        mainPanel.addMouseListener(listener);
        mainPanel.addMouseMotionListener(listener);
    

    从现在开始,您可以调用 mainPanel.getPointerLocation(),如果鼠标不再位于面板上,它应该返回 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多