【问题标题】:Jinput - Get Mouse LocationJinput - 获取鼠标位置
【发布时间】:2015-10-12 22:44:18
【问题描述】:

我正在尝试使用 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
        }
    }
}

这是我的 InputManager,它在初始化时扫描所有输入设备,并将所有鼠标分成一个单独的列表:

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;
    }
}

对于 x 和 y,正在打印的信息始终为 0。我在 Windows 10 上运行它,这会导致任何问题吗?如何使用Jinput从鼠标中获取鼠标数据?

【问题讨论】:

    标签: java jinput


    【解决方案1】:

    JInput 级别较低,您混淆了窗口指针和鼠标。鼠标只是一个具有 >2 相对轴的设备。每次轮询后或每个事件中的值不是像素数或位置,它只是与先前值的大致抽象单位的偏移量。一些鼠标在物理距离变化相同的情况下报告更大的值,因此您必须对其进行缩放,这就是使用 directx 鼠标(也是相对轴设备)的游戏具有鼠标缩放滑块的原因。

    【讨论】:

    • 我不明白这个答案,因为缩放偏移量 = 零仍然为零。
    • 缩放不同的硬件鼠标会让你得到相同的运动,但是 JInput 没有窗口的概念,所以没有偏移量,JInput 从操作系统获得的数据是相对运动来自上次报告的移动,而不是来自窗口或屏幕。
    • 就像 Endolf 所说,x 和 y 不会相对于某个窗口的原始位置连续递增或引用。它只是以特定于鼠标的单位为增量提供最后一次轮询。即使在移动鼠标时,主要功能(控制台应用程序)似乎仍然为 x 和 y 提供零值。它似乎需要一个 JFrame 或 JavaFX 应用程序(至少在 window 7 中)。
    【解决方案2】:

    在从 JInput github JInput @ GitHub 下载并按照他们的示例 ReadFirstMouse.java 创建一个与您非常相似的主函数后,我也只得到了鼠标 x 和 y 增量的零。

    我最终发现了一个涉及创建 JavaFX 应用程序的变通方法。我还发现用 JFrame 应用程序JFrame solution 解释和解决了同样的零问题。所以这可能是 Window 系统上的一个问题,因为我也在使用 Windows 7,但我不确定。

    这是一个带有 TornadoFx 的 Kotlin 解决方案,但它可能很容易转换为 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}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多