我正在创建一个刽子手游戏,在点击右侧字母按钮后,我无法获取包含该单词的每个字符的jlabel。我一直遇到麻烦,因为我对使用Java Guis相对较新。下面是字母按钮的动作监听器。
private class LetterHandler implements ActionListener{
private char letterVal;
public LetterHandler(char lv){
letterVal = lv;
}
//checks if clicked button has the correct value as word char
public void actionPerformed(ActionEvent e){
for(int x = 1; x <= selectedWord.wordLength; x++){
if(selectedWord.wordValue.charAt(x - 1) == letterVal){
// JLabel letterValLabel = new JLabel(String.valueOf(letterVal));
wordSpacesArray.get(x-1).setName(String.valueOf(letterVal));
wordSpacesArray.get(x-1).revalidate();
continue;
}
else{
continue;
}
}
checkWin();
triesLeft--;
triesLeftLabel.revalidate();
}
//finds if all jlabels are complete or not
public void checkWin(){
for(int x = 1; x <= wordSpacesArray.size(); x++){
String charVal;
charVal = String.valueOf(wordSpacesArray.get(x-1));
if(charVal != "?"){
System.out.println("youWon");
System.exit(0);
}
else{
break;
}
charVal = null;
}
}
}
感谢任何帮助。如果您需要程序代码,请告诉我们谢谢:)
答案 0 :(得分:1)
代码存在一些问题。但是,我会首先关注您当前的问题:
我假设wordSpacesArray
是一个列表,其中包含该单词的JLabel
个字母。
当通知此ActionListener时,您尝试使用与此按钮对应的字母更新wordSpacesArray
中的标签。但是,为了更新JLabel上显示的文本,您必须调用JLabel#setText(String)
和不 JLabel#setName(String)
。所以该行应
wordSpacesArray.get(x-1).setText(String.valueOf(letterVal));
// ^ Use setText here!
现在,关于其他问题:
revalidate
continue
您应该不将字符串与==
进行比较,但使用equals
// if(charVal != "?") { ... } // Don't do this!
if(!charVal.equals("?")){ ... } // Use this instead
但是在这种情况下charVal
无论如何都会出错:它将是标签的字符串表示,而不是其内容。所以你应该从标签中获取文字,如下所示:
// String charVal = String.valueOf(wordSpacesArray.get(x-1)); // NO!
String charVal = wordSpacesArray.get(x-1).getText(); // Yes!
只要您不在其上调用triesLeftLabel
,setText
就不会更新
checkWin
方法的逻辑是有缺陷的。当您找到不问号的第一个字母时,您打印“您赢了”。我认为当没有字母是问号时,它应该打印“你赢了”。System.exit(0)
。这是一个不好的做法。让您的应用程序正常结束。 (在这种情况下,可能只是处理主框架,虽然这对游戏来说也是有问题的......)总而言之,这个类可能看起来像这样:
private class LetterHandler implements ActionListener
{
private char letterVal;
public LetterHandler(char lv)
{
letterVal = lv;
}
// checks if clicked button has the correct value as word char
@Override
public void actionPerformed(ActionEvent e)
{
for (int x = 0; x < selectedWord.wordLength; x++)
{
if (selectedWord.wordValue.charAt(x) == letterVal)
{
wordSpacesArray.get(x).setText(String.valueOf(letterVal));
}
}
checkWin();
triesLeft--;
triesLeftLabel.setText(String.valueOf(triesLeft));
}
// finds if all jlabels are complete or not
public void checkWin()
{
for (int x = 0; x < wordSpacesArray.size(); x++)
{
String charVal = wordSpacesArray.get(x).getText();
if (charVal.equals("?"))
{
// There is still an incomplete label
return;
}
}
// When it reaches this line, no incomplete label was found
System.out.println("You won");
}
}