如何从LibGDX列表中获取所选项目?

时间:2015-08-21 19:45:00

标签: libgdx

我尝试了一些不同的方法从列表中获取所选项目(请参阅下面的代码),但我尝试的所有内容只返回列表中的第一项,无论实际选择了哪个项目。在视觉上它似乎工作,因为单击它时正确的项目会突出显示。

作为我正在尝试做的一般概述,我有一个文件夹,其中包含所有已保存的预设文件(json文件),然后我将所有文件的名称读入字符串列表,由此列表可以选择一个特定的预设,然后我有一个单独的“加载”文本按钮,加载从列表中选择的项目。但如上所述,单击加载按钮时,不会从列表中加载正确的项目。

这是我的代码:

public class PresetLoadMenu extends Menu {
    private GUI gui;
    private SaveManager saveManager;

    private Table scrollPaneContainerTable;
    private ScrollPane scrollPane;
    private Table scrollTable;
    private List<String> presetList;
    private TextButton loadButton;

    private FileHandle rootFolderHandle = Gdx.files.external(“presets/”);   

    public PresetLoadMenu(GUI gui){
        this.gui = gui;
        refreshList();

        scrollTable = new Table();
        scrollTable.add(presetList);        
        scrollPane = new ScrollPane(scrollTable);

        scrollPaneContainerTable = new Table();
        scrollPaneContainerTable.add(scrollPane).size(this.getWidth(), this.getHeight()*.2f);
        add(scrollPaneContainerTable);

        row();

        loadButton = new TextButton("LOAD", gui.menuStyles.getMenuOkCancelButtonStyle());
        loadButton.addCaptureListener(new ChangeListener(){
            @Override
            public void changed(ChangeEvent event, Actor actor){
                // METHOD 1:
                // System.out.println("SELECTED PRESET: " + presetList.getSelected());

                // METHOD 2:
                // System.out.println("SELECTED PRESET: " + presetList.getSelection().getLastSelected());

                // METHOD 3:
                // for (int i=0; i<presetList.getSelection().size(); i++){
                //     System.out.println("INDEX: " + i + "  SELECTED PRESET: " + presetList.getSelection().toArray().get(i));
                // }
            }
        });
        add(loadButton).size(loadButton.getWidth(), loadButton.getHeight());        
    }

    public void refreshList(){
        FileHandle[] files = rootFolderHandle.list();
        Array<String> namesArray = new Array<String>();
        for(FileHandle file: files) {
            namesArray.add(file.name());
        }

        presetList = new List<String>(gui.menuStyles.getListStyle());
        presetList.setItems(namesArray);        
    }
}

我尝试使用for循环的最后一个方法只是为了看看它是否会打印出我点击的其他项目,但它仍然只打印了第一个项目并且没有检测到我点击了任何其他项目。

2 个答案:

答案 0 :(得分:0)

根据要求,我将我的上一条评论复制为答案,以便结束我的问题。

问题实际上是我发布的类之外的其他东西,所以presetList.getSelected()可能工作得很好,因为我弄清楚问题是什么。但在我弄明白之前,我已经将List换成了一个ButtonGroup,这对我来说实际上比使用List更好,所以它已经解决了。列表具有内置侦听器,可以在触摸时选择项目,因此在尝试向上或向下滚动时将选择项目。使用按钮,我可以只有一个监听器用于检查状态,这就是我想要的。

答案 1 :(得分:0)

根据你的回答,我通过创建一个TextButton(buttonTable)表来解决它,每个表都用字符串初始化:

final TextButton button = new TextButton("my string",skin);

和听众:

button.addListener(new ClickListener() {
    public void clicked (InputEvent event, float x, float y) {
        button.getText()));
    }
}); 

此buttonTable初始化ScrollPane以允许垂直滚动:

scrollPane = new ScrollPane(buttonsTable);

此scrollPane已添加到用于格式化表单的表中:

mainTable.add(scrollPane);

此表是添加到舞台的演员:

stage.addActor(mainTable);