如何实现有助于在 java 中拖动圆圈的鼠标侦听器?
How to implement a mouse listener that will help drag a circle in java?
我正在想办法完成下面的作业
- 为您的 Circle class 编写一个方法 void move(Point p) 获取一个 Point 并移动圆,使其中心位于该点。
- 在 CirclePanel 构造函数中,创建一个 CirclesListener object 并使其监听鼠标事件和鼠标移动事件。
- 使 CirclesListener class 除了 MouseListener 接口之外还实现 MouseMotionListener 接口。这需要两个步骤:请注意 header 中的 CirclesListener 实现了 MouseMotionListener。为两个 MouseMotionListener 方法添加主体,mouseDragged 和 mouseMoved。在 mouseDragged 中,只需将圆移动到 MouseEvent 的 getPoint 方法返回的点并重新绘制。为 mouseMoved.
提供一个空 body
我知道我需要做什么(大部分情况下),但我只是不知道该怎么做。 (编程新手)。谢谢!
public class circlePanel extends JPanel {
private final int WIDTH = 600, HEIGHT = 400;
private Circle circle;
// -------------------------------------------------------------------
// Sets up this panel to listen for mouse events.
// -------------------------------------------------------------------
public circlePanel() {
addMouseListener(new CirclesListener());
setPreferredSize(new Dimension(WIDTH, HEIGHT));
}
// -------------------------------------------------------------------
// Draws the current circle, if any.
// -------------------------------------------------------------------
public void paintComponent(Graphics page) {
super.paintComponent(page);
if (circle != null)
circle.draw(page);
}
// ******************************************************************
// Represents the listener for mouse events.
// ******************************************************************
private class CirclesListener implements MouseListener, MouseMotionListener {
// ---------------------------------------------------------------
// Creates a new circle at the current location whenever the
// mouse button is pressed and repaints.
// ---------------------------------------------------------------
public void mousePressed(MouseEvent event) {
if (circle == null) {
circle = new Circle(event.getPoint());
} else if (circle.isInside(event.getPoint())) {
circle = null;
} else {
circle.move(getMousePosition());
}
repaint();
}
// -----------------------------------------------------------------
// Provide empty definitions for unused event methods.
// -----------------------------------------------------------------
public void mouseClicked(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseEntered(MouseEvent event) {
setBackground(Color.white);
}
public void mouseExited(MouseEvent event) {
setBackground(Color.blue);
}
}
}
这是圆圈 class
public class Circles {
// ----------------------------------------------------------------
// Creates and displays the application frame.
// ----------------------------------------------------------------
public static void main(String[] args) {
JFrame circlesFrame = new JFrame("Circles");
circlesFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
circlesFrame.getContentPane().add(new circlePanel());
circlesFrame.pack();
circlesFrame.setVisible(true);
}
}
aannnddddd...这是圆 class
public class Circle {
private int centerX, centerY;
private int radius;
private Color color;
static Random generator = new Random();
// ---------------------------------------------------------
// Creates a circle with center at point given, random radius and color
// -- radius 25..74
// -- color RGB value 0..16777215 (24-bit)
// ---------------------------------------------------------
public Circle(Point point) {
radius = Math.abs(generator.nextInt()) % 50 + 25;
color = new Color(Math.abs(generator.nextInt()) % 16777216);
centerX = point.x;
centerY = point.y;
}
// ---------------------------------------------------------
// Draws circle on the graphics object given
// ---------------------------------------------------------
public void draw(Graphics page) {
page.setColor(color);
page.fillOval(centerX - radius, centerY - radius, radius * 2,
radius * 2);
}
public void move(Point p) {
centerX = p.x;
centerY = p.y;
}
public boolean isInside(Point p) {
if (Math.sqrt(Math.pow(p.x - this.centerX, 2) + Math.pow(p.y -
this.centerY, 2)) < this.radius) {
return true;
} else {
return false;
}
}
}
所以,基本上,根据您的代码示例,您需要:
- 实现
MouseMotionListener
的功能,这将包括 mouseDragged
方法
- 您需要将
CirclesListener
注册到 circlePanel
(JPanel#addMouseMotionListener
)
- 调用
mouseDragged
时,需要从MouseEvent
中取出Point
,调用Circle#move
和repaint
组件
如果遇到困难,最好的起点是 How to Write a Mouse Listener
我正在想办法完成下面的作业
- 为您的 Circle class 编写一个方法 void move(Point p) 获取一个 Point 并移动圆,使其中心位于该点。
- 在 CirclePanel 构造函数中,创建一个 CirclesListener object 并使其监听鼠标事件和鼠标移动事件。
- 使 CirclesListener class 除了 MouseListener 接口之外还实现 MouseMotionListener 接口。这需要两个步骤:请注意 header 中的 CirclesListener 实现了 MouseMotionListener。为两个 MouseMotionListener 方法添加主体,mouseDragged 和 mouseMoved。在 mouseDragged 中,只需将圆移动到 MouseEvent 的 getPoint 方法返回的点并重新绘制。为 mouseMoved. 提供一个空 body
我知道我需要做什么(大部分情况下),但我只是不知道该怎么做。 (编程新手)。谢谢!
public class circlePanel extends JPanel {
private final int WIDTH = 600, HEIGHT = 400;
private Circle circle;
// -------------------------------------------------------------------
// Sets up this panel to listen for mouse events.
// -------------------------------------------------------------------
public circlePanel() {
addMouseListener(new CirclesListener());
setPreferredSize(new Dimension(WIDTH, HEIGHT));
}
// -------------------------------------------------------------------
// Draws the current circle, if any.
// -------------------------------------------------------------------
public void paintComponent(Graphics page) {
super.paintComponent(page);
if (circle != null)
circle.draw(page);
}
// ******************************************************************
// Represents the listener for mouse events.
// ******************************************************************
private class CirclesListener implements MouseListener, MouseMotionListener {
// ---------------------------------------------------------------
// Creates a new circle at the current location whenever the
// mouse button is pressed and repaints.
// ---------------------------------------------------------------
public void mousePressed(MouseEvent event) {
if (circle == null) {
circle = new Circle(event.getPoint());
} else if (circle.isInside(event.getPoint())) {
circle = null;
} else {
circle.move(getMousePosition());
}
repaint();
}
// -----------------------------------------------------------------
// Provide empty definitions for unused event methods.
// -----------------------------------------------------------------
public void mouseClicked(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseEntered(MouseEvent event) {
setBackground(Color.white);
}
public void mouseExited(MouseEvent event) {
setBackground(Color.blue);
}
}
}
这是圆圈 class
public class Circles {
// ----------------------------------------------------------------
// Creates and displays the application frame.
// ----------------------------------------------------------------
public static void main(String[] args) {
JFrame circlesFrame = new JFrame("Circles");
circlesFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
circlesFrame.getContentPane().add(new circlePanel());
circlesFrame.pack();
circlesFrame.setVisible(true);
}
}
aannnddddd...这是圆 class
public class Circle {
private int centerX, centerY;
private int radius;
private Color color;
static Random generator = new Random();
// ---------------------------------------------------------
// Creates a circle with center at point given, random radius and color
// -- radius 25..74
// -- color RGB value 0..16777215 (24-bit)
// ---------------------------------------------------------
public Circle(Point point) {
radius = Math.abs(generator.nextInt()) % 50 + 25;
color = new Color(Math.abs(generator.nextInt()) % 16777216);
centerX = point.x;
centerY = point.y;
}
// ---------------------------------------------------------
// Draws circle on the graphics object given
// ---------------------------------------------------------
public void draw(Graphics page) {
page.setColor(color);
page.fillOval(centerX - radius, centerY - radius, radius * 2,
radius * 2);
}
public void move(Point p) {
centerX = p.x;
centerY = p.y;
}
public boolean isInside(Point p) {
if (Math.sqrt(Math.pow(p.x - this.centerX, 2) + Math.pow(p.y -
this.centerY, 2)) < this.radius) {
return true;
} else {
return false;
}
}
}
所以,基本上,根据您的代码示例,您需要:
- 实现
MouseMotionListener
的功能,这将包括mouseDragged
方法 - 您需要将
CirclesListener
注册到circlePanel
(JPanel#addMouseMotionListener
) - 调用
mouseDragged
时,需要从MouseEvent
中取出Point
,调用Circle#move
和repaint
组件
如果遇到困难,最好的起点是 How to Write a Mouse Listener