public void mousePressed(MouseEvent e) {
//Invoked when a mouse button has been pressed on a component.
if (e.getButton() == MouseEvent.BUTTON1) {
isDown = true;
System.out.println("isDown is now true");
}
if (e.getButton() == MouseEvent.BUTTON3) {
isDown2 = true;
System.out.println("isDown2 is now true");
}
do {
Point location = MouseInfo.getPointerInfo().getLocation();
int x = location.x - (drawingPanel.getLocationOnScreen()).x;
int y = location.y - (drawingPanel.getLocationOnScreen()).y;
drawingPanel.paint(drawingPanel.getGraphics(), (x - (x % 20) - 1), (y - (y % 20) - 1), 19, 19);
} while (isDown);
System.out.println("Mouse has been pressed down.");
}
public void mouseReleased(MouseEvent e) {
//Invoked when a mouse button has been released on a component.
if (e.getButton() == MouseEvent.BUTTON1) {
isDown = false;
System.out.println("isDown is now false");
}
if (e.getButton() == MouseEvent.BUTTON3) {
isDown2 = false;
System.out.println("isDown2 is now false");
}
System.out.println("Mouse has been released.");
}
这是我到目前为止所拥有的。我的初衷是设计代码,以便在按下鼠标时将布尔值
isDown
设置为true,然后在while
为true时运行isDown
循环。如果释放鼠标按钮,则我将isDown
设置为false,以终止while
循环。我在这里搞砸了吗?两个MouseEvent方法不能同时运行吗?
isDown
布尔变量中的更改未注册,并且我的手上有一个无限的while循环。 最佳答案
这是对事件调度线程的经典违反。
所有UI代码都在单个线程中运行。所有事件都是从同一线程分派UI的,这意味着如果您阻塞该线程(使用循环或其他阻塞操作),则不会分派任何事件。这将使您的程序看起来已挂起。
有关更多详细信息,请参见Concurrency in Swing。
您真正应该做的是改为使用MouseMoitionListener
跟踪拖动事件。查看How to use Mouse Listeners以获得更多详细信息。
这drawingPanel.paint(drawingPanel.getGraphics(), (x - (x % 20) - 1), (y - (y % 20) - 1), 19, 19);
也让我无休止。
您永远不要使用getGraphics
来执行自定义绘制。 getGraphics
可以返回null,它只是最后一个绘制周期的快照。使用其他方法重新绘制时,使用此方法完成的任何绘制都将被删除/清除。
您应该创建一个自定义组件(例如JPanel
)并覆盖它的paintComponent
方法,并在其中进行所需的绘制。查看Performing Custom Painting了解更多详细信息
例
public class MouseDraggedTest {
public static void main(String[] args) {
new MouseDraggedTest();
}
public MouseDraggedTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Map<Point, List<Point>> mapPoints;
private Point currentPoint;
public TestPane() {
mapPoints = new HashMap<>(25);
MouseAdapter mouseListener = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
currentPoint = e.getPoint();
mapPoints.put(currentPoint, new ArrayList<Point>(25));
}
@Override
public void mouseReleased(MouseEvent e) {
List<Point> points = mapPoints.get(currentPoint);
if (points.isEmpty()) {
mapPoints.remove(currentPoint);
}
currentPoint = null;
}
@Override
public void mouseDragged(MouseEvent me) {
List<Point> points = mapPoints.get(currentPoint);
points.add(me.getPoint());
repaint();
}
};
addMouseListener(mouseListener);
addMouseMotionListener(mouseListener);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Point startPoint : mapPoints.keySet()) {
List<Point> points = mapPoints.get(startPoint);
for (Point p : points) {
if (startPoint != null) {
g.drawLine(startPoint.x, startPoint.y, p.x, p.y);
}
startPoint = p;
}
}
}
}
}
关于java - 当我释放鼠标按钮时,MouseEvent未注册发布,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14764157/