【问题标题】:libgdx Table can't get ChangeListener for a click to fire?libgdx Table 无法获取 ChangeListener 以单击触发?
【发布时间】:2014-12-03 01:32:11
【问题描述】:

我在舞台上添加了一个表格,但我无法为其触发点击监听器:

Table table = new Table();
table.setX(0);
table.setY(0);
table.setWidth(300);
table.setHeight(300);
table.addListener(new ChangeListener() {
    @Override
    public void changed(ChangeEvent event, Actor actor) {
        System.out.println("click");
    }
});

stage.addActor(table);

我在桌子上设置了一个背景九补丁,它渲染得很好。点击没有效果。如果我在表格中添加标签或按钮之类的东西,然后为这些小部件设置相同的 ChangeListener,监听器就会正常触发。

Table 是否需要一些特殊处理才能使其正常工作?

谢谢

--------- 更新-------

我可以让它工作的唯一方法是使用 EventListener 来阻止 Table 实例上的所有交互:

table.addListener(new EventListener() {
    @Override
    public boolean handle(Event event) {
        return true;
    }
});

所有事件都会在这里按预期触发。

我也尝试将表格设置为可触摸,但 ChangeListener 仍然不会触发:

table.setTouchable(Touchable.enabled);
table.setListener(....);

所以我想我会坚持使用 EventListener 方法。

【问题讨论】:

    标签: libgdx


    【解决方案1】:

    libgdx 中的Table 默认不是touchable,在其构造函数中setTouchable(Touchable.childrenOnly);(看看source) 被调用,这意味着,这个Actor(`Table´)不会得到任何输入事件,但它的孩子会(查看javadoc)。

    因此,要为Table 启用输入事件,而不仅仅是为它的孩子启用,您需要调用setTouchable(Touchable.enabled)

    我希望这能解决你的问题。

    【讨论】:

    • 这仍然对我不起作用。我可以做到这一点的唯一方法是,如果我将 EventListener 添加到面板,然后为 handle() 方法返回“true”。更新了上面的答案。
    • @user3203425 我刚刚又看了一下这个问题,我注意到你正在使用ChangeListener。为什么不添加ClickListener?如果您使用ClickListener 而不是ChangeListener,并且您调用setTocuhable(true),我猜,点击事件将被触发,Table 会注意到它们。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多