简体   繁体   English

Java中的鼠标坐标

[英]Mouse coordinates in Java

I'm working on getting the Co-ordinates of the mouse whenever I click on the window, everything is working perfect but I need to the text to appear where I click on the window, I don't want the text to be fixed in one place, I need it to appear wherever I click on the window.每当我单击 window 时,我都在努力获取鼠标的坐标,一切正常,但我需要在单击 window 的位置显示文本,我不希望将文本固定在一个地方,我需要它出现在我点击 window 的任何地方。 How can that be achieved?怎样才能做到这一点?

Here is the Code:这是代码:

 import java.awt.*;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JLabel;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 public class mouseCrd extends JFrame {
 private JPanel contentPane;
 public mouseCrd() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 650, 650);
    setTitle("Mouse co-ordinates");
    setVisible(true);
    setResizable(false);
    contentPane = new JPanel();
    setContentPane(contentPane);
    contentPane.setLayout(null);
    JPanel panel = new JPanel();
    panel.setBounds(0, 0, 650, 650);
    contentPane.add(panel);
    JLabel label = new JLabel(".................");
    label.setFont(new Font("Tahoma", Font.BOLD, 30));
    panel.add(label);
    panel.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e){
            label.setText("X = "+ e.getX()+" ; Y = "+e.getY());
        }
    });
    addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            super.keyReleased(e);
            int clr = e.getKeyChar();
            if(clr==KeyEvent.VK_B)
            {
                System.out.println("B is pressed");
                label.setForeground(Color.WHITE);
                panel.setBackground(Color.BLACK);
            }
            else if(clr==KeyEvent.VK_W)
            {
                System.out.println("W is pressed");
                label.setForeground(Color.BLACK);
                panel.setBackground(Color.WHITE);
            }
            else if(clr==KeyEvent.VK_R)
            {
                System.out.println("R is pressed");
                label.setForeground(Color.BLACK);
                panel.setBackground(Color.RED);
            }
            else if(clr==KeyEvent.VK_O)
            {
                System.out.println("O is pressed");
                label.setForeground(Color.BLACK);
                panel.setBackground(Color.ORANGE);
            }
            else if(clr==KeyEvent.VK_G)
            {
                System.out.println("G is pressed");
                label.setForeground(Color.BLACK);
                panel.setBackground(Color.GREEN);
            }
        }
    });
}
    public static void main(String[] args){
                EventQueue.invokeLater(new Runnable()
                {
                    public void run() {
                        try {
                            mouseCrd frame = new mouseCrd();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }

There's lots of ways you might achieve this, depending on your needs有很多方法可以实现这一点,具体取决于您的需求

For example, if you wanted to "overlay" the mouse coordinates onto of other components.例如,如果您想将鼠标坐标“叠加”到其他组件上。

玻璃板

One issue with adding a MouseListener to a glassPane is it will block all the MouseEvent s from reaching the other components.MouseListener添加到glassPane的一个问题是它会阻止所有MouseEvent到达其他组件。

Instead, in this example, I tap directly into the Event Queue and process the events directly instead, this allows other components to continue monitoring mouse events through the use of MouseListener s相反,在此示例中,我直接点击事件队列并直接处理事件,这允许其他组件通过使用MouseListener继续监视鼠标事件

咔哒

import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                GlassPane glassPane = new GlassPane();
                frame.setGlassPane(glassPane);
                glassPane.setVisible(true);
                frame.add(new TestPane());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setBorder(new EmptyBorder(20, 20, 20, 20));
            setLayout(new GridBagLayout());
            add(new JLabel("This is so you can keep doing stuff"));

            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("...");
                }
            });
        }

    }

    public class GlassPane extends JPanel implements AWTEventListener {

        private static final long serialVersionUID = 5110857185182004819L;

        private JLabel mousePointLabel = new JLabel();

        public GlassPane() {
            super(null);
            Toolkit.getDefaultToolkit().addAWTEventListener(
                    this,
                    AWTEvent.MOUSE_MOTION_EVENT_MASK
                    | AWTEvent.MOUSE_EVENT_MASK);

            mousePointLabel.setForeground(Color.RED);
            add(mousePointLabel);
            setOpaque(false);
        }

        @Override
        public void eventDispatched(AWTEvent event) {
            if (event instanceof MouseEvent) {

                MouseEvent originalEvent = (MouseEvent) event;

                MouseEvent e = originalEvent;
                Component source = e.getComponent();
                e = SwingUtilities.convertMouseEvent(
                        ((MouseEvent) event).getComponent(),
                        (MouseEvent) event, this);

                if (e.getID() == MouseEvent.MOUSE_PRESSED) {
                    Point p = e.getPoint();
                    mousePointLabel.setText(p.getX() + "x" + p.getY());
                    Dimension size = mousePointLabel.getPreferredSize();
                    mousePointLabel.setSize(size);
                    mousePointLabel.setLocation(p.x - (size.width / 2), p.y - (size.height / 2));
                }
            }
        }
    }
}

According to some other answers out there , you will need to remove the Layout from the Panel where you want to move your component around in. Not considered good practice to remove the Layout, but it meets the requirements to place your component where you click.根据那里的其他一些答案,您将需要从要在其中移动组件的面板中删除布局。删除布局不被认为是好的做法,但它符合将组件放置在单击位置的要求。

Example:例子:

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class ClickToMove
{
  public static void main(String[] args) {
    JFrame frame = new JFrame("Click To Move");
    frame.setSize(600, 400);
    
    JPanel panel = new JPanel();
    panel.setLayout(null);
    frame.getContentPane().add(panel);
    
    JLabel label = new JLabel("Click to move me!", SwingConstants.CENTER);
    label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    label.setSize(150, 50);
    panel.add(label);
    
    panel.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseReleased(MouseEvent event) {
        label.setLocation(event.getX(), event.getY());
        panel.repaint();
      }
    });
    
    frame.setVisible(true);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM