JLabel更新问题

时间:2014-02-22 21:19:36

标签: java user-interface for-loop jlabel updates

我正在创建一个刽子手游戏,在点击右侧字母按钮后,我无法获取包含该单词的每个字符的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;
        }
    }   
}

感谢任何帮助。如果您需要程序代码,请告诉我们谢谢:)

1 个答案:

答案 0 :(得分:1)

代码存在一些问题。但是,我会首先关注您当前的问题:

我假设wordSpacesArray是一个列表,其中包含该单词的JLabel个字母。

当通知此ActionListener时,您尝试使用与此按钮对应的字母更新wordSpacesArray中的标签。但是,为了更新JLabel上显示的文本,您必须调用JLabel#setText(String) JLabel#setName(String)。所以该行应

wordSpacesArray.get(x-1).setText(String.valueOf(letterVal));
                      //      ^  Use setText here!

现在,关于其他问题:

  • 正如评论中所指出的,您应该使用基于0的索引
  • 无需拨打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!
    
  • 只要您不在其上调用triesLeftLabelsetText就不会更新

  • 我认为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");
    }
}