【问题标题】:Why isn't the listener bound to the object I am assigning it to?为什么侦听器没有绑定到我分配给它的对象?
【发布时间】:2021-10-29 09:34:42
【问题描述】:
for (int i = 0; i < mapSize[0]; i++) {
    for (int j = 0; j < mapSize[1]; j++) {
        hashCodes[i][j] = new Image(emptyField);
        int[] targetField = new int[2];
        targetField[0] = i;
        targetField[1] = j;
        hashCodes[i][j].addListener(new InputListener() {
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                return true;
            }

            @Override
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                System.out.println("Empty Field clicked" + Arrays.toString(targetField));
                for (Image[] imageRow : hashCodes) {
                    for (Image actualImage : imageRow) {
                        System.out.print(actualImage.hashCode() + " ");
                    }
                    System.out.println();
                }
                if (MarvelousMashup.useInfinityStone) {
                    MarvelousMashup.useInfinityStone = false;
                    MainMenu.client.getMessageHandler().sendUseInfinityStoneRequest
                            (MarvelousMashup.activeCharacter,
                                    getActualEntity(MarvelousMashup.activeCharacter).getPosition(),
                                    targetField,
                                    getStone(MarvelousMashup.useInfinityStoneID));
                }
            }
        });
        tempField.addActor(hashCodes[i][j]);
    }
}

我正在为每个 Actor 分配一个监听器。但是无论我点击哪个空白字段,每次点击的字段对我来说都是一样的,尽管每个演员都是不同的。

Empty Field clicked[5, 5]
817686795 1047478056 2115628016 611643685 1935122449 872826668 
91323447 110053477 1209411469 1320105604 1076984738 1006751649 
1171434979 1920907467 970535245 194481424 1534755892 1548081008 
753321708 464400749 343563528 1719072416 2092801316 376635015 
1344697180 28597262 300983713 284686302 1940445711 1356840024 
1142347343 1810923540 1581078471 1932332324 33233312 1860491691 

我做错了吗?因为据我了解,每个演员都应该有自己的听众,而不是所有人都是同一个听众。

【问题讨论】:

  • 为什么说每个演员都有不同的听众?在我看来,它们都一样。你看到了什么让你得出结论演员是一样的?我们在这里只看到一个监听器的输出。应该有什么不同?你在代码中做了什么让每个监听器都不同?
  • @markspace 我正在向二维数组添加一个新图像并为它们分配一个侦听器。虽然基本上听众都需要做同样的事情,但他们需要不同的是targetField。每当我创建一个新图像时,我都会使用一个新的目标字段向它添加一个新的侦听器。我所有听众的目标字段仍然是最后一个分配的字段。
  • @markspace 我还应该补充一点,由于某种原因,添加到该字段的每个图像都具有相同的哈希码,即使我在末尾添加了新创建的图像。
  • targetField 是局部变量?你发这里的时候没改代码?我很惊讶Java让你这样做,它显然已经坏了。在侦听器中创建targetField 字段,并通过在构造函数中传递所需的参数来分配它。
  • 在 for 循环之前是否声明了另一个 targetField 变量(可能前面有 final)?这是我看到这段代码编译的唯一方法。

标签: java libgdx listener event-listener hashcode


【解决方案1】:

尝试将targetField 直接添加到监听器并使用构造函数对其进行初始化。

for (int i = 0; i < mapSize[0]; i++) {
    for (int j = 0; j < mapSize[1]; j++) {
        hashCodes[i][j] = new Image(emptyField);
        hashCodes[i][j].addListener( new MyInputListener( i, j ) );
// rest of code...


class MyInputListener extends InputListener {
    int [] targetField = new int[2];
    InputListener( int i, int j ) {
      targetField[0] = i;
      targetField[1] = j;
    }
    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
       return true;
    }

    @Override
    public void touchUp(  // etc...

【讨论】:

  • 这根本不起作用。我不明白你为什么打电话给class InputListener,但这只会导致我出错。 new InputListener ( i, j ) 也无法工作,因为 InputListener 类的构造函数不采用 int。
  • 什么构造函数?不是接口吗?您使用的是什么 API?
  • Input Listener 是一个类,可能你想到的是 EventListener。
  • 通过对您的代码进行一些细微的修改,我设法使其工作。这意味着它没有再抛出任何错误。感谢您朝着正确的方向推动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多