我有一个通过循环添加到表中的文本字段数组。添加的 TextField 数量取决于用户给出的输入。
文本字段用文本“Player #”初始化(# 通过循环递增)。
我希望能够在每个文本字段获得焦点时从它们中删除此文本,并且如果在失去焦点时未输入任何内容,它将恢复为原始字符串。
我的问题是能够访问 TextField 以在 FocusListener 中设置文本。
这是我的代码:(注意:playernames 是在代码片段外部定义的表。)
for(int i=0; i<MainMenu.numplayers; i++) {
playername[i] = new TextField("Player " + (i+1), skin);
playernames.add(new Label("Player " + (i+1) + ":", skin, "black")).padRight(5.0F).padBottom(5.0F);
playernames.add(playername[i]).width(125.0F).padBottom(5.0F);
playernames.row();
playername[i].addListener(new FocusListener() {
public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) {
if(focused == true) {
/** change text to "" */
}
else if(focused==false){
/** change text back to "Player #" if nothing was typed */
}
}
});
如何访问监听器内的 TextField 以便能够更改文本?
最佳答案
最简单的选择可能是添加一个最终变量来保存循环中的文本字段。然后可以在处理程序中直接引用它。一般来说,如果您想从匿名类访问外部变量,请确保它是最终的。
for(int i = 0; i < MainMenu.numplayers; i++) {
final TextField textField = new TextField("Player " + (i+1), skin);
playername[i] = textField;
// ...
textField.addListener(new FocusListener() {
public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) {
if(focused) {
// Access textField here and below as needed
}
else {
// ...
}
}
});
}
我认为事件中引用的参与者应该是文本字段,但这种方法需要类型转换...
关于java - LibGDX:更改焦点上文本字段的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824237/