MouseDragging 即使在释放后仍然触发
MouseDragging still firing even after releasing
您好,提前致谢,
我正在使用 Graphics2D 进行赌场游戏(轮盘赌),所以我正在尝试向赌场筹码(金钱)添加动作,因此我正在使用 MouseDragged 事件,作为测试,我只使用 1 个椭圆.
下面的代码
package roulette;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
public class RouletteInterface extends JPanel{
private List<Shape> money = new ArrayList<>();
public RouletteInterface() {
createEllipseGrap();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g4d = (Graphics2D) g.create();
paintEllipseGrap(g4d, g);
g4d.dispose();
}
protected void createEllipseGrap() {
Ellipse2D elipse = new Ellipse2D.Double(100, 100, 30, 30);
money.add(elipse);
addMouseListener(new moneyMouseListener());
addMouseMotionListener(new moneyMouseListener());
}
protected void paintEllipseGrap(Graphics2D g3d, Graphics g) {
g3d.setColor(Color.BLUE);
g3d.fill(money.get(0));
}
private class moneyMouseListener extends MouseAdapter {
int dragging;
private int x;
private int y;
@Override
public void mousePressed(MouseEvent e) {
if(money.get(0).contains(e.getPoint())) {
x = e.getX();
y = e.getY();
dragging = 0;
} else {
return ;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if(dragging == 0) {
x = e.getX();
y = e.getY();
Ellipse2D elipse = new Ellipse2D.Double(x, y, 30, 30);
money.set(0, elipse);
repaint();
} else {
}
}
@Override
public void mouseReleased(MouseEvent m) {
dragging = 1;
repaint();
}
}
}
public class principal{
public static void main(String[] args) {
new principal();
}
public principal() {
JFrame frame = new JFrame();
frame.add(new RouletteInterface());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有什么问题吗?
即使在我释放鼠标点击后 MouseDragged 事件仍在触发,因此当我在 window
的另一侧单击并拖动时,圆圈仍在随光标移动
您的问题是您要将 moneyMouseListeners 的两个不同实例添加为 MouseListener 和 MouseMotionListener:
addMouseListener(new moneyMouseListener());
addMouseMotionListener(new moneyMouseListener());
你必须这样做:
moneyMouseListener mListener = new moneyMouseListener();
addMouseListener(mListener);
addMouseMotionListener(mListener);
PS.: 当使用像 "dragging" 变量这样的变量时,它只用于分配“1”或“0”,你应该使用布尔变量 "true" 和 "false" ;)
此外,您可能要考虑drawing/undrawing芯片使用Graphics的异或模式,而不是一直调用repaint()。
- 在普通模式下按:undraw芯片,然后xor绘制。
- 拖动:异或绘制芯片,重新设置位置,再次异或绘制。
- 解除:异或绘制芯片,然后正常模式绘制。
这样一来,如果您将筹码移到背景中的某物上方(或另一个筹码上方),就不会损坏另一个筹码或背景。
您好,提前致谢,
我正在使用 Graphics2D 进行赌场游戏(轮盘赌),所以我正在尝试向赌场筹码(金钱)添加动作,因此我正在使用 MouseDragged 事件,作为测试,我只使用 1 个椭圆.
下面的代码
package roulette;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
public class RouletteInterface extends JPanel{
private List<Shape> money = new ArrayList<>();
public RouletteInterface() {
createEllipseGrap();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g4d = (Graphics2D) g.create();
paintEllipseGrap(g4d, g);
g4d.dispose();
}
protected void createEllipseGrap() {
Ellipse2D elipse = new Ellipse2D.Double(100, 100, 30, 30);
money.add(elipse);
addMouseListener(new moneyMouseListener());
addMouseMotionListener(new moneyMouseListener());
}
protected void paintEllipseGrap(Graphics2D g3d, Graphics g) {
g3d.setColor(Color.BLUE);
g3d.fill(money.get(0));
}
private class moneyMouseListener extends MouseAdapter {
int dragging;
private int x;
private int y;
@Override
public void mousePressed(MouseEvent e) {
if(money.get(0).contains(e.getPoint())) {
x = e.getX();
y = e.getY();
dragging = 0;
} else {
return ;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if(dragging == 0) {
x = e.getX();
y = e.getY();
Ellipse2D elipse = new Ellipse2D.Double(x, y, 30, 30);
money.set(0, elipse);
repaint();
} else {
}
}
@Override
public void mouseReleased(MouseEvent m) {
dragging = 1;
repaint();
}
}
}
public class principal{
public static void main(String[] args) {
new principal();
}
public principal() {
JFrame frame = new JFrame();
frame.add(new RouletteInterface());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有什么问题吗?
即使在我释放鼠标点击后 MouseDragged 事件仍在触发,因此当我在 window
您的问题是您要将 moneyMouseListeners 的两个不同实例添加为 MouseListener 和 MouseMotionListener:
addMouseListener(new moneyMouseListener());
addMouseMotionListener(new moneyMouseListener());
你必须这样做:
moneyMouseListener mListener = new moneyMouseListener();
addMouseListener(mListener);
addMouseMotionListener(mListener);
PS.: 当使用像 "dragging" 变量这样的变量时,它只用于分配“1”或“0”,你应该使用布尔变量 "true" 和 "false" ;)
此外,您可能要考虑drawing/undrawing芯片使用Graphics的异或模式,而不是一直调用repaint()。
- 在普通模式下按:undraw芯片,然后xor绘制。
- 拖动:异或绘制芯片,重新设置位置,再次异或绘制。
- 解除:异或绘制芯片,然后正常模式绘制。
这样一来,如果您将筹码移到背景中的某物上方(或另一个筹码上方),就不会损坏另一个筹码或背景。