1

I am attempting to print out the mouse location using Jinput:

public static void main(String[] args) {
    input = new InputManager();

    while (true) {
        for (Mouse mouse : input.getMice()) {
            mouse.poll();
            System.out.println("Mouse X: " + mouse.getX().getPollData());
            System.out.println("Mouse Y: " + mouse.getY().getPollData());
            System.out.println("---------");
        }
        try {
            Thread.sleep(100);
        } catch (Exception e) {
            // DO NOTHING < BAD
        }
    }
}

Here is my InputManager, which upon initialization scans for all the input devices, and separates all the mice into a separate list:

public class InputManager {
    public ArrayList<Mouse> mice;

    public InputManager() {
        mice = new ArrayList<Mouse>();
        Controller[] inputs = ControllerEnvironment.getDefaultEnvironment()
            .getControllers();
        for (int i = 0; i < inputs.length; i++) {
            Mouse mouse;
            if (inputs[i].getType() == Controller.Type.MOUSE) {
                mouse = (Mouse) inputs[i];
                mice.add(mouse);
            }
        }
        System.out.println("Discovered " + mice.size() + " mice.");
    }

    public ArrayList<Mouse> getMice() {
        return mice;
    }
}

The information that is being printed out is always 0 for both x and y. I am running this on windows 10, does that cause any issues? How do I get the mouse data from the mouse using Jinput?

2 Answers2

0

JInput is lower level, you are confusing a window pointer, and a mouse. The mouse is just a device with >2 relative axis. The values after each poll or in each event are not a number of pixels, or a position, it is just an offset in roughly abstract units from it's previous value. Some mice report larger values for the same amount of physical distance changed, so you have to scale it, which is why games that use the directx mouse (also a relative axis device) have a mouse scale slider.

Endolf
  • 120
  • 9
  • I don't understand this answer because scaling the offset = zero still gives zero. – J.E.Tkaczyk May 29 '18 at 19:13
  • Scaling different hardware mice would get you the same movement, but JInput doesn't have the concept of a window, so has no offset to work from, the data JInput gets from the OS is a relative movement from the last reported movement, not from the window, or screen. – Endolf May 30 '18 at 15:44
  • Like Endolf says, the x and y will not continuously increment or reference relative to some window's origin location. It just gives the delta form the last poll in mouse-specific units. Still it seems the main function (console application) always gives zero values for x and y even when moving the mouse. It appears to need a JFrame or JavaFX application (at least in window's 7). – J.E.Tkaczyk May 30 '18 at 19:07
0

I was also getting only zeros for mouse x and y increments after downloading from JInput github JInput @ GitHub and creating a main function much like yours by following their example ReadFirstMouse.java.

I eventually discovered a work around involving creating a JavaFX application instead. I also found this same zeros problem explained and solved with a JFrame application JFrame solution. So this may be a problem specifically on Window's systems as I'm also using Windows 7, but I'm not sure.

Here is a Kotlin w/TornadoFx solution, but it perhaps easy to convert to Java/JavaFx.

import javafx.animation.AnimationTimer
import javafx.geometry.Pos
import net.java.games.input.Controller
import net.java.games.input.ControllerEnvironment
import tornadofx.*

class JInputView : View("----------JInput Demo---------") {
val mice = getMice()
val labels=mice.map{label(it.name)}

override val root = vbox(20, Pos.BASELINE_LEFT) {
    setPrefSize(400.0,100.0)
    mice.forEachIndexed { i, m ->
        hbox {
            label(m.name + "  ->")
            children.add(labels[i])
        }
    }
}
val timer = object : AnimationTimer() {
    override fun handle(now: Long) {
        mice.forEachIndexed {i,it->
            it.poll() // Poll the controller
            // Get the axes
            val xComp = it.getComponent(net.java.games.input.Component.Identifier.Axis.X)
            val yComp = it.getComponent(net.java.games.input.Component.Identifier.Axis.Y)
            labels[i].text = "x,y= %f, %f".format(xComp.pollData,yComp.pollData)
        }
    }
}

init { timer.start() }
}

fun getMice() : List<Controller> {
    //don't forget to set location for DLL, or use command line option: -Djava.library.path="
    System.setProperty( "java.library.path", "C:/Your Directory where Dll is present" );

    /* Get the available controllers */
    val controllers = ControllerEnvironment.getDefaultEnvironment().controllers
    println("number controllers %d".format(controllers.size))
    return controllers.filter{it.type==Controller.Type.MOUSE}
}
J.E.Tkaczyk
  • 557
  • 1
  • 8
  • 19