Search code examples
javaswingfor-loopjframejlabel

JLabel.setText("__") will not print multiple times while in for loop


I have placed my JLabel.setText("__") inside a for loop so it can print the length of a word replacing each letter with a 'space' . It is for a hangman game to display the length of the word using blank spaces. However it is only printing once. Any tips on why? Also, if you have any tips on better organizing my code that would be appreciated. Thanks in advance.

/*PACKAGE DECLARATION*/
package Game;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


/************************
 * GAME MECHANICS CLASS *
 * **********************/
public class GameStructure {

    /* INSTANCE DECLARATIONS */
    private String []wordList = {"computer","java","activity","alaska","appearance","article",
           "automobile","basket","birthday","canada","central","character","chicken","chosen",
           "cutting","daily","darkness","diagram","disappear","driving","effort","establish","exact",
           "establishment","fifteen","football","foreign","frequently","frighten","function","gradually",
           "hurried","identity","importance","impossible","invented","italian","journey","lincoln",
           "london","massage","minerals","outer","paint","particles","personal","physical","progress",
           "quarter","recognise","replace","rhythm","situation","slightly","steady","stepped",
           "strike","successful","sudden","terrible","traffic","unusual","volume","yesterday"};
    private int []length = new int [64];
    private JTextField tf;//text field instance variable (used)
    private JLabel jl2;//label instance variable (used)
    private JLabel jl3;//label instance (working on)
    private String letter;


    /*****************
     * LENGTH METHOD *
     * ***************/
    public void length(){

        jl3 = new JLabel();

        int j = 0;
        for(j = 0; j<64; j++) {
            length[j] = wordList[j].length();//gets length of words in wordList
        }//end for
        int l = 0;
            for(int m = 0; m<length[l]; m++) {//supposed to print length of word with '__' as each letter
                jl3.setText("__ ");//instead only printing once
                l++;
        }//end for
    }//end length method


    /*****************
     * WINDOW METHOD *
     * ***************/
    public void window() {

    LoadImageApp i = new LoadImageApp();//calling image class

    JFrame gameFrame = new JFrame();//declaration
    JPanel jp = new JPanel();
    JPanel jp2 = new JPanel();//jpanel for blanks
    JLabel jl = new JLabel("Enter a Letter:");//prompt with label

    tf = new JTextField(1);//length of text field by character
    jl2 = new JLabel("Letters Used:    ");

    jp2.add(jl3);
    jp.add(jl);//add label to panel
    jp.add(tf);//add text field to panel
    jp.add(jl2);//add letters used

    gameFrame.add(i); //adds background image to window
    i.add(jp); // adds panel containing label to background image panel
    i.add(jp2);

    gameFrame.setTitle("Hangman");//title of frame window
    gameFrame.setSize(850, 600);//sets size of frame
    gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//exit when 'x' button pressed
    gameFrame.setIconImage(new ImageIcon("Hangman-Game-grey.png").getImage());//set the frame icon to an image loaded from a file
    gameFrame.setLocationRelativeTo(null);//window centered
    gameFrame.setResizable(false);//user can not resize window
    gameFrame.setVisible(true);//display frame

  }//end window method


    /*********************
     * USER INPUT METHOD *
     * *******************/
    public void userInput() {

        tf.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {//when enter key pressed

            JTextField tf = (JTextField)e.getSource();

            letter = tf.getText();
            jl2.setText(jl2.getText() + letter + " ");//sets jlabel text to users entered letter

            }//end actionPerformed method

        });

    }//end userInput method

}//end GameMechanics class

Solution

  • "However it is only printing once. Any tips on why?"

    setText will only set the text once. So all you're doing in the loop is setting the text over and over. Here is a suggestion. Concatenate the Strings in the loop, then set the text. Like this:

    String line = "";
    for(int m = 0; m<length[l]; m++) {
        line += "__ ";
        l++;
    }
    jl3.setText(line);
    

    " Also, if you have any tips on better organizing my code that would be appreciated. "

    Try Code Review for this.