Java 使用侦听器和鼠标指针位置检查指针是否在圆内
我试着在光标的点上画一行文字,说明光标是在画的圆内还是在画的圆外。我不完全确定如何做到这一点,我认为我所做的全局X和Y坐标不能正常工作 有人知道当光标在圆内或圆外时如何触发绘制字符串的方法吗?我对Java还是有点陌生Java 使用侦听器和鼠标指针位置检查指针是否在圆内,java,swing,mouselistener,Java,Swing,Mouselistener,我试着在光标的点上画一行文字,说明光标是在画的圆内还是在画的圆外。我不完全确定如何做到这一点,我认为我所做的全局X和Y坐标不能正常工作 有人知道当光标在圆内或圆外时如何触发绘制字符串的方法吗?我对Java还是有点陌生 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MouseCircleLocation extends JPanel { boolean insideCircleSta
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MouseCircleLocation extends JPanel {
boolean insideCircleStatus;
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
public MouseCircleLocation() {
//the listener that checks if the mouse if moving.
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
//gets the location of the mouse.
int x = e.getX();
int y = e.getY();
//simple check to see if the mouse location is inside the circle area.
if ( (Math.pow((x - 100), 2)) + (Math.pow((y - 60), 2)) < (Math.pow((50), 2))){
insideCircleStatus = true;
}
else{
insideCircleStatus = false;
}
}
});
}
//basic frame setup.
public static void main(String[] args) {
JFrame frame = new JFrame("Mouse Location");
frame.add(new MouseCircleLocation());
frame.setSize(210, 190);
frame.setLocationRelativeTo(null); // Center the frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//draws the circle.
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (insideCircleStatus = true){
g.drawString("Point is inside the circle", x, y);
System.out.println("Point is inside the circle");
}
if (insideCircleStatus = false){
g.drawString("Point is outside the circle", x, y);
System.out.println("Point is outside the circle");
}
g.setColor(Color.BLACK);
g.drawOval(100 - 50, 60 - 50, 50 *2, 50 * 2);
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类鼠标位置扩展JPanel{
布尔内循环状态;
PointerInfo a=MouseInfo.getPointerInfo();
点b=a.getLocation();
intx=(int)b.getX();
int y=(int)b.getY();
公共鼠标位置(){
//检查鼠标是否移动的侦听器。
addMouseMotionListener(新的MouseAdapter(){
@凌驾
public void mouseMoved(MouseEvent e){
//获取鼠标的位置。
int x=e.getX();
int y=e.getY();
//简单检查鼠标位置是否在圆圈区域内。
如果((数学功率((x-100),2))+(数学功率((y-60),2))<(数学功率((50),2))){
insideCircleStatus=真;
}
否则{
insideCircleStatus=假;
}
}
});
}
//基本框架设置。
公共静态void main(字符串[]args){
JFrame=新的JFrame(“鼠标位置”);
frame.add(新的鼠标位置());
框架。设置尺寸(210190);
frame.setLocationRelativeTo(null);//将帧居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//画圆。
受保护组件(图形g){
超级组件(g);
如果(InsideCrcelStatus=true){
g、 抽绳(“点在圆内”,x,y);
System.out.println(“点在圆内”);
}
如果(InsideCrcelStatus=false){
g、 抽绳(“点在圆外”,x,y);
System.out.println(“点在圆外”);
}
g、 设置颜色(颜色为黑色);
g、 抽卵(100-50,60-50,50*2,50*2);
}
}有一件事你忘记了,那就是调用
repaint()
。仅仅因为insidecrestatus
的值发生更改,并不会使其自动repaint()
,所以您需要在MouseListener
中调用repaint()
此外,您还可以使用Shape
界面和包含的方法
Ellipse2D.Double circle = new Ellipse2D.Double(50, 50, 200, 200);
...
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
if (circle.contains(e.getPoint())) {
System.out.println("Click within Circle");
}
}
});
请参阅使用MouseMotionListener
的完整示例和-另请参阅
另见。。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestShapeContains extends JPanel {
private static final int D_W = 500;
private static final int D_H = 500;
Ellipse2D.Double circle = new Ellipse2D.Double(50, 50, 300, 300);
Point p = new Point();
private boolean insideCircle = false;
public TestShapeContains() {
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseMoved(MouseEvent e) {
if (circle.contains(e.getPoint())) {
insideCircle = true;
} else {
insideCircle = false;
}
p = e.getPoint();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.draw(circle);
if (insideCircle) {
g.drawString("Mouse in Circle at point " + (int)p.getX() + ", " + (int)p.getY(),
(int)p.getX(), (int)p.getY());
} else {
g.drawString("Mouse outside Circle at point " + (int)p.getX() + ", " + (int)p.getY(),
(int)p.getX(), (int)p.getY());
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(D_W, D_H);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new TestShapeContains());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}