libgdx中的Table无法获取ClickListener以触发点击事件?

4

我在一个舞台(stage)中添加了一个表格(table),但是我无法让它的点击监听器(listener)起作用:

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设置给这些控件,那么监听器就可以正常触发。
是否需要特殊处理才能使表格正常工作?
谢谢。
--------- 更新 -------------------
我唯一能让它正常工作的方法是使用EventListener阻止表格实例上的所有交互。
table.addListener(new EventListener() {
    @Override
    public boolean handle(Event event) {
        return true;
    }
});

在这里,所有事件都会按预期触发。
我还尝试将表格设置为可触摸,但是ChangeListener仍无法触发:
table.setTouchable(Touchable.enabled);
table.setListener(....);

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

1个回答

5
在libgdx中,默认情况下Table不可触摸,在其构造函数中调用setTouchable(Touchable.childrenOnly);(请看源代码),这意味着这个Actor(即`Table´)将不会得到任何输入事件,但它的子元素会(查看javadoc)。
因此,要为Table启用输入事件,而不仅仅是对其子元素,需要调用setTouchable(Touchable.enabled)
希望这可以解决您的问题。

这对我仍然没有用。唯一能让这个发生的方法是如果我向面板添加一个EventListener,然后在handle()方法中返回'true'。已更新上面的答案。 - user3203425
@user3203425,我再次查看了您的问题,并注意到您正在使用ChangeListener。为什么不添加一个ClickListener呢?如果您使用ClickListener而不是ChangeListener,并调用setTocuhable(true),我猜测单击事件将被触发,Table也会注意到它们。 - Robert P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接