0

I am currently making a custom Hangman game in Java and have got to the stage where the buttons appear on a JPanel. I haven't gotten the buttons to work because the if statement in the letterA actionListener won't access. Also, the letters, when clicked, don't update the graphic for the Hanger class, which displays the hanged person. Can someone help see why the letterA if statement won't access and fix it. I've tried using multiple System.out.println() statements to see if the program ever entered the if if statement in the letterA actionListener and it doesn't. Keep in mind, I haven't gotten the letter's in the HangmanWord to change color when clicked. Any advice or help would be great. This is an example of clicking the letter A button and not having any drawing appear (the head is already supposed to be there because I set the count to a number other than 0.

    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import java.util.*;

public class HangmanGUI extends JFrame{

JFrame Hangman = new JFrame("Hangman");
JPanel panel = new JPanel();

private ArrayList<String> Words = new ArrayList<String>();
private String[] AlphabetArray;
private ArrayList<String> Alphabet = new ArrayList<String>();
private String HangmanWord;
private final int PanelHeight = 400;
private final int PanelWidth = 900;
private final int BUTTON = 20;
//private JButton play; /** this is the button you push to play the  */ 
//private JButton reset; /** this is the button you push to reset the game */ 
//private int totalWins; /** this is the total number of game wins */
//private int totalGames; /** this is the total number of games */
private JButton letterA; /** the letter button for the specified letter */
private JButton letterB; /** the letter button */
private JButton letterC; /** the letter button */
private JButton letterD; /** the letter button */
private JButton letterE; /** the letter button */
private JButton letterF; /** the letter button */
private JButton letterG; /** the letter button */
private JButton letterH; /** the letter button */
private JButton letterI; /** the letter button */
private JButton letterJ; /** the letter button */
private JButton letterK; /** the letter button */
private JButton letterL; /** the letter button */
private JButton letterM; /** the letter button */
private JButton letterN; /** the letter button */
private JButton letterO; /** the letter button */
private JButton letterP; /** the letter button */
private JButton letterQ; /** the letter button */
private JButton letterR; /** the letter button */
private JButton letterS; /** the letter button */
private JButton letterT; /** the letter button */
private JButton letterU; /** the letter button */
private JButton letterV; /** the letter button */
private JButton letterW; /** the letter button */
private JButton letterX; /** the letter button */
private JButton letterY; /** the letter button */
private JButton letterZ; /** the letter button */
private Hanger hang;
private int count = 0;


public HangmanGUI(){
    panel.setBorder(BorderFactory.createTitledBorder("LETTERS"));
    panel.setBounds(600, 200, 450, 250);
    assignLetters();
    add(panel);
    addWords();
    getWord();

    hang = new Hanger(getCount());
    hang.setBounds(0,0, 250, 200);
    this.add(hang, BorderLayout.CENTER);


}

public int getCount(){
    return count;
}

public void action(ActionEvent a, JButton x){
    if (!HangmanWord.contains(x.getText()) || !HangmanWord.contains(x.getText().toLowerCase())){
        count++;
        System.out.println(x.getText());
        hang.setCount(count);
        hang = new Hanger(getCount());
        hang.setBounds(0,0,250,200);
        Hangman.remove(hang);
        Hangman.add(hang);
        Hangman.setVisible(true);
        Hangman.invalidate();
        Hangman.validate();
        Hangman.repaint();
    }
    x.setVisible(false);
}


public void assignLetters(){
    count = 5;

    letterA = new JButton();
    letterA.setText("A");
    letterA.setOpaque(true);
    panel.add(letterA);
    letterA.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            count ++;
            if ((HangmanWord.contains(letterA.getText()))==true || (HangmanWord.contains(letterA.getText().toLowerCase()))==true){
                count --;
            }
            hang.setCount(getCount());
            hang = new Hanger(getCount());
            hang.setBounds(0,0, 250, 200);

            Hangman.remove(hang);
            Hangman.add(hang);
            letterA.setVisible(false);

        }
    });


    letterB = new JButton();
    letterB.setText("B");
    panel.add(letterB);
    //letterB.setBounds(480, 0, BUTTON, BUTTON);
    letterB.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            action(e, letterB);
            if ((HangmanWord.indexOf("B")==-1) || (HangmanWord.indexOf("b")==-1)){
                letterB.setVisible(false);
                count ++;
                System.out.println("b");
                hang.setCount(getCount());
                hang.setBounds(0,0, 250, 200);
                Hangman.add(hang, BorderLayout.CENTER);
            }
            letterA.setVisible(false);
            hang = new Hanger(getCount());
            hang.setCount(getCount());
            hang.setBounds(0,0, 250, 200);;
            Hangman.add(hang, BorderLayout.CENTER);
            Hangman.setVisible(true);
            Hangman.invalidate();
            Hangman.validate();
            Hangman.repaint();
            letterB.setForeground(Color.RED);
        }

    });

    letterC = new JButton();
    letterC.setText("C");
    panel.add(letterC);
    //letterC.setBounds(510, 0, BUTTON, BUTTON);
    letterC.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterC.setVisible(false);
            if (!HangmanWord.contains(letterC.getText())){
                count ++;
                hang.setCount(getCount());
                hang = new Hanger(getCount());
                hang.setBounds(0,0, 250, 200);;
                Hangman.add(hang, BorderLayout.CENTER);
                Hangman.setVisible(true);
            }

        }
    });

    letterD = new JButton();
    letterD.setText("D");
    panel.add(letterD);
    //letterD.setBounds(540, 0, BUTTON, BUTTON);
    letterD.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterD.setVisible(false);
            if (!HangmanWord.contains(letterD.getText())){
                count ++;
                hang.setCount(getCount());
                hang = new Hanger(getCount());
            }

        }
    });

    letterE = new JButton();
    letterE.setText("E");
    panel.add(letterE);
    //letterE.setBounds(570, 0, BUTTON, BUTTON);
    letterE.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterE.setVisible(false);
            if (!HangmanWord.contains(letterE.getText())){
                count ++;
            }
        }
    });

    letterF = new JButton();
    letterF.setText("F");
    panel.add(letterF);
    //letterF.setBounds(600, 0, BUTTON, BUTTON);
    letterF.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterF.setVisible(false);
            if (!HangmanWord.contains(letterF.getText())){
                count ++;
            }
        }
    });

    letterG = new JButton();
    letterG.setText("G");
    panel.add(letterG);
    //letterG.setBounds(630, 0, BUTTON, BUTTON);
    letterG.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterG.setVisible(false);
            if (!HangmanWord.contains(letterG.getText())){
                count ++;
            }
        }
    });

    letterH = new JButton();
    letterH.setText("H");
    panel.add(letterH);
    //letterH.setBounds(660, 0, BUTTON, BUTTON);
    letterH.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterH.setVisible(false);
            if (!HangmanWord.contains(letterH.getText())){
                count ++;
            }
        }
    });

    letterI = new JButton();
    letterI.setText("I");
    panel.add(letterI);
    //letterI.setBounds(690, 0, BUTTON, BUTTON);
    letterI.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterI.setVisible(false);
            if (!HangmanWord.contains(letterI.getText())){
                count ++;
            }
        }
    });

    letterJ = new JButton();
    letterJ.setText("J");
    panel.add(letterJ);
    //letterJ.setBounds(720, 0, BUTTON, BUTTON);
    letterJ.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterJ.setVisible(false);
            if (!HangmanWord.contains(letterJ.getText())){
                count ++;
            }
        }
    });

    letterK = new JButton();
    letterK.setText("K");
    panel.add(letterK);
    //letterK.setBounds(750, 0, BUTTON, BUTTON);
    letterK.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterK.setVisible(false);
            if (!HangmanWord.contains(letterK.getText())){
                count ++;
            }
        }
    });

    letterL = new JButton();
    letterL.setText("L");
    panel.add(letterL);
    //letterL.setBounds(780, 0, BUTTON, BUTTON);
    letterL.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterL.setVisible(false);
            if (!HangmanWord.contains(letterL.getText())){
                count ++;
            }
        }
    });

    letterM = new JButton();
    letterM.setText("M");
    panel.add(letterM);
    //letterM.setBounds(810, 0, BUTTON, BUTTON);
    letterM.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterM.setVisible(false);
            if (!HangmanWord.contains(letterM.getText())){
                count ++;
            }
        }
    });

    letterN = new JButton();
    letterN.setText("N");
    panel.add(letterN);
    //letterN.setBounds(450, 30, BUTTON, BUTTON);
    letterN.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterN.setVisible(false);
            if (!HangmanWord.contains(letterN.getText())){
                count ++;
            }
        }
    });

    letterO = new JButton();
    letterO.setText("O");
    panel.add(letterO);
    //letterO.setBounds(480, 30, BUTTON, BUTTON);
    letterO.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterO.setVisible(false);
            if (!HangmanWord.contains(letterO.getText())){
                count ++;
            }
        }
    });

    letterP = new JButton();
    letterP.setText("P");
    panel.add(letterP);
    //letterP.setBounds(510, 30, BUTTON, BUTTON);
    letterP.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterP.setVisible(false);
            if (!HangmanWord.contains(letterP.getText())){
                count ++;
            }
        }
    });

    letterQ = new JButton();
    letterQ.setText("Q");
    panel.add(letterQ);
    //letterQ.setBounds(540, 30, BUTTON, BUTTON);
    letterQ.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterQ.setVisible(false);
            if (!HangmanWord.contains(letterQ.getText())){
                count ++;
            }
        }
    });

    letterR = new JButton();
    letterR.setText("R");
    panel.add(letterR);
    //letterR.setBounds(570, 30, BUTTON, BUTTON);
    letterR.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterR.setVisible(false);
            if (!HangmanWord.contains(letterR.getText())){
                count ++;
            }
        }
    });

    letterS = new JButton();
    letterS.setText("S");
    panel.add(letterS);
    //letterS.setBounds(600, 30, BUTTON, BUTTON);
    letterS.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterS.setVisible(false);
            if (!HangmanWord.contains(letterS.getText())){
                count ++;
            }
        }
    });

    letterT = new JButton();
    letterT.setText("T");
    panel.add(letterT);
    //letterT.setBounds(630, 30, BUTTON, BUTTON);
    letterT.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterT.setVisible(false);
            if (!HangmanWord.contains(letterT.getText())){
                count ++;
            }
        }
    });

    letterU = new JButton();
    letterU.setText("U");
    panel.add(letterU);
    //letterU.setBounds(660, 30, BUTTON, BUTTON);
    letterU.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterU.setVisible(false);
            if (!HangmanWord.contains(letterU.getText())){
                count ++;
            }
        }
    });

    letterV = new JButton();
    letterV.setText("V");
    panel.add(letterV);
    //letterV.setBounds(690, 30, BUTTON, BUTTON);
    letterV.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterV.setVisible(false);
            if (!HangmanWord.contains(letterV.getText())){
                count ++;
            }
        }
    });

    letterW = new JButton();
    letterW.setText("W");
    panel.add(letterW);
    //letterW.setBounds(720, 30, BUTTON, BUTTON);
    letterW.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterW.setVisible(false);
            if (!HangmanWord.contains(letterW.getText())){
                count ++;
            }
        }
    });

    letterX = new JButton();
    letterX.setText("X");
    panel.add(letterX);
    //letterX.setBounds(750, 30, BUTTON, BUTTON);
    letterX.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterX.setVisible(false);
            if (!HangmanWord.contains(letterX.getText())){
                count ++;
            }
        }
    });

    letterY = new JButton();
    letterY.setText("Y");
    panel.add(letterY);
    //letterY.setBounds(780, 30, BUTTON, BUTTON);
    letterY.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterY.setVisible(false);
            if (!HangmanWord.contains(letterY.getText())){
                count ++;
            }
        }
    });

    letterZ = new JButton();
    letterZ.setText("Z");
    panel.add(letterZ);
    //letterZ.setBounds(810, 30, BUTTON, BUTTON);
    letterZ.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            letterZ.setVisible(false);
            if (!HangmanWord.contains(letterZ.getText())){
                count ++;
            }
        }
    });

}

public void alphabet(){
    String [] AlphabetArray;
    AlphabetArray = new String[] {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
    Alphabet.addAll(Arrays.asList(AlphabetArray));
}

public void addWords(){
    Words.add("Quip");


}


public String getWord(){
    int wordsIndex = (int) (Math.random() * (Words.size()));
    HangmanWord =  Words.get(wordsIndex);
    return HangmanWord;
}


public void setWord(String a){
    HangmanWord = a;
}


}


import javax.swing.*;
import java.awt.*;
public class GUI extends JPanel
{
public static void main(String[] args) 
{
    HangmanGUI theGUI = new HangmanGUI();
    theGUI.setTitle("HANGMAN");
    theGUI.setSize(1440,900);
    theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    ColorPanel panel = new ColorPanel(Color.blue);
    Container pane = theGUI.getContentPane();
    pane.add(panel);


    String a = panel.getWord();

    theGUI.setWord(a);

    theGUI.setVisible(true); 
}

}

    import javax.swing.*;
import java.awt.*;

public class ColorPanel extends JPanel 
{

private String word; 

public ColorPanel (Color backColor)
{
    setBackground(backColor); //takes parameter from GUIWindow class and sets background color
}

public void paintComponent(Graphics g)
{

    super.paintComponent(g); //call this line first
    //choose a color before you draw the shape 
    g.setColor(Color.blue);
    g.drawRect(0,  150,  100,  200); //the numbers give the coordinates and size




    Font f = new Font("Comic Sans MS", Font.BOLD, 30);
    g.setFont(f);
    g.setColor(Color.cyan);
    g.drawString("HANGMAN", 200, 50);


    g.setColor(Color.black);
    g.fillRect(0,75,240,30); //this should always be there


    //number wrong should be a counter
    HangmanGUI wor = new HangmanGUI();
    word = wor.getWord();

    int counter=0;
    int max=0;



        //find the length of the longest word in the saying
        for(int x=0; x<word.length(); x++){
                if (!word.substring(x,x+1).equals(" ")){
                    counter++;

                    if (counter>max){
                        max=counter;
                    }
                }
                else{

                    counter=0; 

            }

            }


    int x1cord = 25;
    int y1cord=500;
    int space=500/(max); //TRY TO PUT MAX HERE

    for (int i=0; i<word.length(); i++){    

        if (word.substring(i, i+1).equals(" ")){

            x1cord=25;//+100 if same line
            y1cord+=space;

        }
        else{   
            g.setColor(Color.black);
            g.drawLine(x1cord,  y1cord, x1cord+space/2,  y1cord);

            f = new Font("Comic Sans MS", Font.BOLD, space/3);
            g.setFont(f);
            g.setColor(Color.cyan);
            g.drawString(word.substring(i,i+1), x1cord+space/4, y1cord-5);

            x1cord+=space;
        }
        }

    }

public String getWord(){
    return word;
}

}

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.BasicStroke;  
    import java.awt.Rectangle;
    import java.awt.Graphics2D;           
    import java.awt.geom.Ellipse2D;       
  import java.awt.geom.Rectangle2D;     
  import java.awt.geom.Arc2D;           
  import java.awt.geom.Line2D;          
  import javax.swing.JPanel;

public class Hanger extends JPanel{
private JPanel hangedPerson;
private int count;

public Hanger(int getCount){
    count = getCount;
}

public void setCount(int getCount){
    count = getCount;
}

public void paintComponent(Graphics g){
    super.paintComponents(g);
    Graphics2D hangedPerson = (Graphics2D) g;
    hangedPerson.setBackground(Color.BLUE);
    hangedPerson.setPaint(Color.BLUE);
    hangedPerson.drawRect(0,  150,  100,  200);


        if (count>0){
            g.setColor(Color.black);
            g.drawLine(175,  75,  175,  150); //if one wrong    
        }

        if (count>1){
            g.setColor(Color.black); //if two wrong
            g.fillOval(150,150,50,50); 
        }

        if (count>2){
            g.setColor(Color.black);
            g.drawLine(175,  350,  175,  200);//if  three wrong
        }

        if (count>3){
            g.setColor(Color.black);
            g.drawLine(90,  200,  175,  250);//if four wrong
        }

        if (count>4){
            g.setColor(Color.black);
            g.drawLine(175,  250,  260,  200);//if five wrong
        }

        if (count>5){
            g.setColor(Color.black);
            g.drawLine(175,  350,  250,  400);// if six wrong
        }

        if (count>6){
            g.setColor(Color.black);
            g.drawLine(175,  350,  100,  400); //if seven wrong
        }



}


}
emp440
  • 11
  • 3
  • 1
    Your program is throwing a `NullPointerException` whenever you try to access `HangmanWord` (variables should start with a lowercase letter) of your `HangmanGUI`, which you set to `panel.getWord()` (panel is instance of`ColorPanel`). I can't find anything in the code where you actually initialize `panel.word`, so I guess that's why it's not working. Also, why is there an additional `HangmanGUI` in the `ColorPanel` `paintComponent` method? I don't think you want another GUI constructed every time the panel repaints... Please provide an [mcve] for better help. – Lukas Rotter May 19 '16 at 16:48
  • I believe the panel.word you're referring to is `panel.getWord()` which I initialized in `ColorPanel`. Is there any way to get the `JFrame` to be repainted every time I update the count, which in turn should draw another shape. The expected behavior is that, for the word "Quip", I should be able to click the `letterA` and have both the button disappear and have a new shape from the `paintComponent` method be painted on the JFrame. – emp440 May 19 '16 at 17:03

0 Answers0