The mouseMoved method is called when the mouse is moved without a mouse button
being pressed. The mouseDragged method is called when the mouse is moved while one or
more buttons are being pressed. Note that we should not use the code e.getButton() in
this case because more than one mouse button could potentially be pressed. Instead, when
writing code for the mouseDragged method, we should always call the getModifiersEx
method. It will return code that shows us which mouse buttons are pressed.
Note that the behavior of the getModifiersEx method is a little tricky to understand.
If we do an experiment, we will see that method returns 1024 when the left mouse button is
pressed, 2048 when the middle mouse button is pressed, 4096 when the right mouse button
is pressed, 3072 when both the left and middle button are pressed and so on. In other words,
Java will return a unique integer for every mouse-button combination. We may be tempted
to just enumerate all combinations when the left mouse button is pressed. However, this is
the wrong approach because there is no guarantee that the getModifiersEx method will
not return different values in the next Java version.
Let us look in greater detail at the codes that are returned by the getModifiersEx
method. If the left mouse button is pressed, then the number 1024 is returned, which is the
binary number 0000 0100 0000 0000. If the middle button is pressed, then the binary number
0000 1000 0000 0000 is returned. If both the left and middle button are pressed, then the
number 0000 1100 0000 0000 is returned. In other words, there is a bitmap mask for each
mouse button. If more than one button is pressed, then the combination of the bitmap masks
of the buttons is returned. If we try to print the constant MouseEvent.BUTTON1 DOWN MASK ,
then we will get the binary number 0000 0100 0000 0000. This corresponds to just the left
mouse button being pressed. The operation “&” is the bitwise and operator. It performs
the operation and on each pair of bits. The result is 1 only when both bits are one. In other
words, we can think of 1 as true and of 0 as false . Suppose that we want to evaluate
the result of the expression e.getModifiersEx() & MouseEvent.BUTTON1 DOWN MASK .If
e.getModifiersEx() returns 0000 1100 0000 0000 and MouseEvent.BUTTON1 DOWN MASK is
equal to 0000 0100 0000 0000, then we will get the following result.
0000 1100 0000 0000
0000 0100 0000 0000
(result of &)
0000 0100 0000 0000
In other words, the result is different from 0, which means that the left mouse button is
pressed. Alternatively, if we want to check if the left or right mouse button is pressed, then
we can write the following code.
e. getModifiersEx() & (MouseEvent.BUTTON1DOWN MASK | MouseEvent .
BUTTON2 DOWN MASK)
” is the bitwise or operator. The resulting bit is 1 if one of the
input bits is 1. In the above expression, the right-hand side of the operator & will create a
number that has two 1s in its binary representation. If the left-hand side has one of these 1s
set (i.e., the left or middle mouse button is pressed), then the whole expression will evaluate
to a number that is different from 0.
On a side note, one might be tempted to use & instead of && and
Note that the operator “
This is certainly possible. However, the operations are not equivalent. For example, the &&
operation will not evaluate the second argument if the first argument is false . Conversely,
the & operation always evaluates both arguments.