Java 鼠标单击以选择布尔值

Java 鼠标单击以选择布尔值,java,swing,Java,Swing,java开发新手您好,我在一个线程中创建了一个MouseListener和MouseAdapter,用于控制鼠标按下、释放和拖动操作的鼠标动作。每个动作都会做特定的事情,但我无法将每个动作中的每个MouseEvent e分配给一个变量 那么,我们如何处理这个问题呢?我还想知道方法参数MouseEvent e是否特定于每个方法 这是我的密码: Thread thread = new Thread() { public void run() { addMouseListener(n

java开发新手您好,我在一个线程中创建了一个
MouseListener
MouseAdapter
,用于控制鼠标按下、释放和拖动操作的鼠标动作。每个动作都会做特定的事情,但我无法将每个动作中的每个
MouseEvent e
分配给一个变量

那么,我们如何处理这个问题呢?我还想知道方法参数
MouseEvent e
是否特定于每个方法

这是我的密码:

Thread thread = new Thread() {
    public void run() {

    addMouseListener(new MouseAdapter() {
        //@override deleted because i want to use e as a different action.
        public void mouseaction(MouseEvent e) {

            /* In here i want to control MouseEvent  e action
            (drag, pressed and released) and do specific things in with e event
            and if e changes state should be changed in code during while(true) */

        }
    }
}

通过调用方法
getModifiersEx()
,可以从
mouseEvent
获取所有这些信息,例如:

int eventType = e.getModifiersEx();
if (eventType & MOUSE_DRAGGED > 0) {
    // Code to be executed when mouse is dragged 
}

if (eventType & MOUSE_PRESSED > 0) {
    // Code to be executed when mouse button is pressed
}
...

请注意,
eventType
是一个位字段,其中可以同时激活多个位。

您可以通过调用方法
getModifiersEx()
mouseEvent
获取所有这些信息,例如:

int eventType = e.getModifiersEx();
if (eventType & MOUSE_DRAGGED > 0) {
    // Code to be executed when mouse is dragged 
}

if (eventType & MOUSE_PRESSED > 0) {
    // Code to be executed when mouse button is pressed
}
...

请注意,
eventType
是一个位字段,可以同时激活多个位。

我将解决这个问题:

我还想知道方法参数MouseEvent e是否特定于每个方法

每次Swing调用此方法时,都会生成一个新事件。您的
@Override
注释没有任何区别

因此,当用户单击某个位置时,会为其生成一个编号为2556的MouseEvent,并将该事件作为参数调用该方法

当用户拖动鼠标时,将生成编号为2557的MouseEvent,并再次使用此新事件作为参数调用该方法


更广泛地说:所有那些
MouseEvent
s将始终是不同的实例。它们也是不可变的

这意味着,如果您想保存一些信息以供游戏循环查看,则需要将相关条件存储在某个字段中。您将无法从匿名类访问它,因为您没有对它的句柄。下面是一个快速而肮脏的例子(无耻地重用@FrankPuffer的代码):


我将解决这个问题:

我还想知道方法参数MouseEvent e是否特定于每个方法

每次Swing调用此方法时,都会生成一个新事件。您的
@Override
注释没有任何区别

因此,当用户单击某个位置时,会为其生成一个编号为2556的MouseEvent,并将该事件作为参数调用该方法

当用户拖动鼠标时,将生成编号为2557的MouseEvent,并再次使用此新事件作为参数调用该方法


更广泛地说:所有那些
MouseEvent
s将始终是不同的实例。它们也是不可变的

这意味着,如果您想保存一些信息以供游戏循环查看,则需要将相关条件存储在某个字段中。您将无法从匿名类访问它,因为您没有对它的句柄。下面是一个快速而肮脏的例子(无耻地重用@FrankPuffer的代码):

你不能只是编方法名。您需要实现侦听器的方法。您需要分别处理mousePressed和MouseRelease方法。对于mouseDragged,您需要实现MouseMotionListener

阅读上的Swing教程中的部分。您可以找到以下部分:

  • 如何实现鼠标侦听器
  • 如何实现MouseMotionListener
  • 两者都包含工作示例

    你不能只是编方法名。您需要实现侦听器的方法。您需要分别处理mousePressed和MouseRelease方法。对于mouseDragged,您需要实现MouseMotionListener

    阅读上的Swing教程中的部分。您可以找到以下部分:

  • 如何实现鼠标侦听器
  • 如何实现MouseMotionListener

  • 这两个都包含工作示例。

    顺便说一句,你不需要单独的线程来添加鼠标侦听器。顺便说一句,你不需要单独的线程来添加鼠标侦听器。既然你在最后告诉它,你可以有多个修饰符,所以
    else if
    不是一个好主意,如果多个
    ,则最好确保每个cases@AxelH:是的,我修改了我的答案。@FrankPuffer int eventType=e.getModifiersEx();每一次返回0action@Zeki切里克:我纠正了我的错误,你可以检查二进制
    &
    的结果是否大于零。(我很困惑,因为在C++语言中,你可以使用<代码> int /CUT>作为布尔值,而在java中则无效。)因为你在最后告诉它,你可以有多个修饰符,所以<代码>如果不是< /C> >不是多好的代码,多个<代码>如果最好是每一个都要测试。cases@AxelH:对,已修改我的答案。@FrankPuffer int eventType=e.getModifiersEx();每一次返回0action@Zeki切里克:我纠正了我的错误,你可以检查二进制
    &
    的结果是否大于零。(我很困惑,因为在C++语言中,你可以使用<代码> int /CODE >作为布尔值,而在java中则无效。)如果(EntyType和MouthEnguly.MousEpHress)是int,编译器说它不能转换。但是,如果(EngType和MouthEnguly.MousEnPress)是int,编译器就不能转换它。
    //@override deleted because i want to use e as a different action.
    public void mouseaction(MouseEvent e)