java eclipse 事件系统只有在有打印功能时才有效
The java eclipse eventsystem only works when there is a print function
我有一个 class 来处理所有的鼠标事件,这样可以很容易地检查是否单击了鼠标按钮,但它似乎只有在我添加以下行时才有效:system.out.println(mouseManager.getMouseX());
.
鼠标管理器class:
public class MouseManager implements MouseListener, MouseMotionListener {
private boolean leftPressed, rightPressed;
private int mouseX, mouseY;
public MouseManager() {
}
public boolean isLeftPressed() {
return leftPressed;
}
public boolean isRightPressed() {
return rightPressed;
}
public int getMouseX() {
return mouseX;
}
public int getMouseY() {
return mouseY;
}
@Override
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
leftPressed = true;
}
else if (e.getButton() == MouseEvent.BUTTON3) {
rightPressed = true;
}
}
}
如您所见,MouseManager class 非常简单,但它用于在其他 classes 中调用以使鼠标输入更容易。
但是 在 Visuals class 中(这不是一个合适的名称,它更像是主要的 class)事情出错了。
public void Update() {
if (mouseManager.isLeftPressed()) {
Vector2 posClicked = GetRoundedMousePos();
int index = GetPosInArray(posClicked);
System.out.println(Grid.cells.get(index).cellType.toString());
if (Grid.cells.get(index).cellType == Cell.CellType.GROUND) {
Grid.cells.get(index).cellType = Cell.CellType.SAND;
repaint();
}
}
System.out.println(mouseManager.getMouseX());
}
如您所见,我添加了 prinln
以确保其有效。
注意:
- 我只展示了更新方法,因为整个脚本太长了
- Update 方法每帧调用一次
- mouseManager 在上面用这一行声明:
private static MouseManager mouseManager = new MouseManager();
如果更新底部没有 System.out.println(mouseManager.getMouseX());
,mouseManager.isLeftPressed()
将不起作用。那么如何解决呢?
AND 这可能与上面的错误有关,但即使使用 println()
功能,mouseManager 似乎并不总是检测到鼠标按下。
鼠标更新发生在另一个线程上,对此没有明确的处理。考虑到从 MouseManager 到调用者的单向信息流,这里可能只需要可变字段:
private volatile boolean leftPressed, rightPressed;
private volatile int mouseX, mouseY;
顺便说一句,您应该考虑用 final
实例字段替换 static
class 字段(并进一步将其作为构造函数参数传递):
private final MouseManager mouseManager = new MouseManager();
我有一个 class 来处理所有的鼠标事件,这样可以很容易地检查是否单击了鼠标按钮,但它似乎只有在我添加以下行时才有效:system.out.println(mouseManager.getMouseX());
.
鼠标管理器class:
public class MouseManager implements MouseListener, MouseMotionListener {
private boolean leftPressed, rightPressed;
private int mouseX, mouseY;
public MouseManager() {
}
public boolean isLeftPressed() {
return leftPressed;
}
public boolean isRightPressed() {
return rightPressed;
}
public int getMouseX() {
return mouseX;
}
public int getMouseY() {
return mouseY;
}
@Override
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
leftPressed = true;
}
else if (e.getButton() == MouseEvent.BUTTON3) {
rightPressed = true;
}
}
}
如您所见,MouseManager class 非常简单,但它用于在其他 classes 中调用以使鼠标输入更容易。 但是 在 Visuals class 中(这不是一个合适的名称,它更像是主要的 class)事情出错了。
public void Update() {
if (mouseManager.isLeftPressed()) {
Vector2 posClicked = GetRoundedMousePos();
int index = GetPosInArray(posClicked);
System.out.println(Grid.cells.get(index).cellType.toString());
if (Grid.cells.get(index).cellType == Cell.CellType.GROUND) {
Grid.cells.get(index).cellType = Cell.CellType.SAND;
repaint();
}
}
System.out.println(mouseManager.getMouseX());
}
如您所见,我添加了 prinln
以确保其有效。
注意:
- 我只展示了更新方法,因为整个脚本太长了
- Update 方法每帧调用一次
- mouseManager 在上面用这一行声明:
private static MouseManager mouseManager = new MouseManager();
如果更新底部没有 System.out.println(mouseManager.getMouseX());
,mouseManager.isLeftPressed()
将不起作用。那么如何解决呢?
AND 这可能与上面的错误有关,但即使使用 println()
功能,mouseManager 似乎并不总是检测到鼠标按下。
鼠标更新发生在另一个线程上,对此没有明确的处理。考虑到从 MouseManager 到调用者的单向信息流,这里可能只需要可变字段:
private volatile boolean leftPressed, rightPressed;
private volatile int mouseX, mouseY;
顺便说一句,您应该考虑用 final
实例字段替换 static
class 字段(并进一步将其作为构造函数参数传递):
private final MouseManager mouseManager = new MouseManager();