Java JLabel更新问题

Java JLabel更新问题,java,user-interface,for-loop,jlabel,updates,Java,User Interface,For Loop,Jlabel,Updates,我正在创建一个刽子手游戏,在点击右字母按钮后,我很难更新包含单词每个字符的jlabel。我在这方面遇到了一些问题,因为我对使用JavaGUI还比较陌生。下面是字母按钮的操作侦听器 private class LetterHandler implements ActionListener{ private char letterVal; public LetterHandler(char lv){ letterVal = lv; }

我正在创建一个刽子手游戏,在点击右字母按钮后,我很难更新包含单词每个字符的jlabel。我在这方面遇到了一些问题,因为我对使用JavaGUI还比较陌生。下面是字母按钮的操作侦听器

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;
        }
    }   
}
私有类LetterHandler实现ActionListener{
私人信件;
公共信笺处理程序(字符lv){
letterVal=lv;
}
//检查单击的按钮是否具有word char的正确值
已执行的公共无效操作(操作事件e){

对于(int x=1;x代码存在一些问题。但是,我将首先尝试关注您当前的问题:

我假设
wordSpacesArray
是一个包含单词的单个字母的
JLabel
s的列表

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

wordSpacesArray.get(x-1).setText(String.valueOf(letterVal));
                      //      ^  Use setText here!
现在,关于其他问题:

  • 正如评论中指出的,应该使用基于0的索引
  • 不需要调用
    revalidate
  • 不需要在其当前for中使用
    continue
  • 您不应将字符串与
    =
    进行比较,而应与
    相等的字符串进行比较

    // 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!
    
    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");
        }
    }
    
  • 只要不调用
    setText
    ,则不会更新
    triesLeftLabel

  • 我认为
    checkWin
    方法的逻辑是有缺陷的。当你发现第一个字母不是问号时,你会打印“你赢了”。我认为当没有字母是问号时,它应该打印“你赢了”
  • 你不应该调用
    System.exit(0)
    。这是一种不好的做法。让你的应用程序正常结束。(在这种情况下,可能只是处理主框架,尽管这对于游戏来说也是有问题的…)
总之,这个类可能是这样的:

// String charVal = String.valueOf(wordSpacesArray.get(x-1)); // NO!
String charVal = wordSpacesArray.get(x-1).getText(); // Yes!
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");
    }
}
私有类LetterHandler实现ActionListener
{
私人信件;
公共信笺处理程序(char lv)
{
letterVal=lv;
}
//检查单击的按钮是否具有word char的正确值
@凌驾
已执行的公共无效操作(操作事件e)
{
for(int x=0;x
请提出具体问题,而不是“我在做[x]时遇到问题”;创建一个程序,该程序只执行您无法理解或无法实现的行为,然后将其全部发布。任何试图仅使用您提供的信息来帮助您的人都是瞎猜。此外,如果您的循环使用传统的基于0的开始,则所有内容都将更易于阅读:
(int x=0;x
。循环中的任何地方都不需要
x-1
。好的,谢谢你的帮助。会的。哇。我不知道我做错了多少。非常感谢你的帮助。你提供了关于如何改进我的程序和编码技术的可靠信息。我真的很感激。谢谢:)