9 Replies - 560 Views - Last Post: 25 January 2012 - 04:33 PM Rate Topic: -----

Topic Sponsor:

#1 Handler  Icon User is offline

  • D.I.C Head

Reputation: 15
  • View blog
  • Posts: 196
  • Joined: 01-April 10

Hangman: Word not updating

Posted 25 January 2012 - 07:53 AM

When I press reset the new word loads but doesnt display in the TextField, and I cannot figure out why...
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hangman;

import java.net.URL;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 *
 * @author Alpha
 */
public class Hangman extends Application {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    WordHandler words = new WordHandler();
    TextField word = new TextField();
    String dWord = "Press reset";
    Stage primaryStage;
    BorderPane layout;
    ArrayList<Button> btns = new ArrayList();

    @Override
    public void start(Stage primaryStage) {
        loadHang();
        word.setEditable(false);
        this.primaryStage = primaryStage;
        primaryStage.setTitle("Andreas Venter - Hangman");
        primaryStage.setWidth(300);
        primaryStage.setHeight(500);
        primaryStage.setResizable(false);
        StackPane root = new StackPane();
        BorderPane layout = new BorderPane();
        this.layout = layout;

        layout.setCenter(getHang(level));

        VBox hBottom = new VBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");

        HBox vTop = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");
        layout.setBottom(hBottom);

        HBox vCenter = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");


        HBox vBottom = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");

        hBottom.getChildren().add(vTop);
        hBottom.getChildren().add(vCenter);
        hBottom.getChildren().add(vBottom);
        layout.setBottom(hBottom);


        HBox hTop = new HBox();
        hTop.setPadding(new Insets(15, 12, 15, 12));
        hTop.setSpacing(10);
        hTop.setStyle("-fx-background-color: #FFFFFF");
        layout.setTop(hTop);

        Button btn1 = new Button();
        btn1.setText("Reset");
        btn1.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                processBtn(event);
            }
        });
        hTop.getChildren().add(btn1);

        word.setStyle("-fx-background-color: #C0C0C0");
        word.setText("Press Reset");
        //word.setFont(new Font(24));
        hTop.getChildren().add(word);




        for (int x = 0; x <= 9; x++) {
            Button btn = new Button();
            int y = 65 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vTop.getChildren().add(btn);
            btns.add(btn);
        }
        for (int x = 0; x <= 8; x++) {
            Button btn = new Button();
            int y = 65 + 9 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vCenter.getChildren().add(btn);
            btns.add(btn);
        }
        for (int x = 0; x <= 8; x++) {
            Button btn = new Button();
            int y = 65 + 9 + 8 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vBottom.getChildren().add(btn);
            btns.add(btn);
        }
        root.getChildren().add(layout);
        primaryStage.setScene(new Scene(root, 300, 250));
        for (Button e : btns) {
            e.setDisable(true);

        }
        primaryStage.show();
    }

    void processBtn(ActionEvent event) {
        Button btn = (Button) event.getSource();
        String letter = btn.getText();

        switch (letter) {
            case "Reset":
                reset();
                break;
            case "Q":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "W":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "E":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "R":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "T":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "Y":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "U":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "I":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "O":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "P":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "A":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "S":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "D":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "F":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "G":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "H":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "J":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "K":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "L":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "Z":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "X":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "C":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "V":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "B":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "N":
                processLetter(letter);
                btn.setDisable(true);
                break;
            case "M":
                processLetter(letter);
                btn.setDisable(true);
                break;
        }
        if (level > 9) {
            for (Button e : btns) {
                e.setDisable(true);
                word.setText("Game Over");
            }
        }


    }

    ImageView getHang(int level) {
        ImageView v = new ImageView();
        v.setStyle("-fx-background-color: #FFFFFF");
        v.setImage(hangs[level]);
        v.setFitWidth(200);
        v.setFitHeight(200);
        v.setPreserveRatio(true);

        return v;
    }

    void reset() {
        level = 0;
        for (Button e : btns)
        {
            e.setDisable(false);
        }
        
        dWord = words.getWord(7);
        //System.out.println(dWord);
        String t = "";
        
        for (int x = 0; x <= dWord.length(); x++)
        {
            t.concat("-");
        }

        word.setText(t);
        
        layout.setCenter(getHang(level));
    }

    void processLetter(String letter) {

        while (true) {
            int pos;
            try {
                pos = dWord.indexOf(letter);
            } catch (Exception e) {
                level++;
                layout.setCenter(getHang(level));
                break;
            }
            if (pos == -1) {
                level++;
                layout.setCenter(getHang(level));
                break;
            }

            dWord.replaceFirst(letter, "-");
            char lets[] = word.getText().toCharArray();
            lets[pos] = letter.charAt(0);
            word.setText(lets.toString());
        }


    }

    void loadHang() {
        for (int x = 0; x < 11; x++) {

            Image img = new Image(getClass().getResourceAsStream("/resources/hanging/hang" + x + ".gif"));

            hangs[x] = img;
        }
    }
    int level = 0;
    private Image hangs[] = new Image[11];
}



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hangman;

import java.util.ArrayList;

/**
 *
 * @author aventer
 */
public class WordHandler {

    ArrayList<String> words = new ArrayList<String>();

    public WordHandler() {
        loadWords();
    }

    public String getWord(int length) {
        ArrayList<String> available = new ArrayList<String>();
        for (String e : words) {
            if (e.length() == length) {
                available.add(e);
            }
        }
        int randomNum = 0 + (int) (Math.random() * available.size());

        return available.get(randomNum);
    }

    private void loadWords() {
        words.add("physical");
        words.add("whistle");
        words.add("solid");
        words.add("hospital");
        words.add("driving");
        words.add("carriage");
    }
}




Is This A Good Question/Topic? 0
  • +

Replies To: Hangman: Word not updating

#2 jon.kiparsky  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 1719
  • View blog
  • Posts: 3,247
  • Joined: 19-March 11

Re: Hangman: Word not updating

Posted 25 January 2012 - 09:02 AM

Why, why, why, oh, why are you abusing that poor switch?

What about

switch (letter) {
            case "Reset":
                reset();
                break;
            default:
                processLetter(letter);
                btn.setDisable(true);
                break;
}



You could probably even do it a little better, but this chops out 100 lines of code and makes it possible to maintain, so that's some improvement.

I'm afraid I don't see the problem with resetting your textfield. There's some smelly code in there, but I can't track through it all while I'm at work. Sorry.
Was This Post Helpful? 2
  • +
  • -

#3 Handler  Icon User is offline

  • D.I.C Head

Reputation: 15
  • View blog
  • Posts: 196
  • Joined: 01-April 10

Re: Hangman: Word not updating

Posted 25 January 2012 - 11:07 AM

Thanks for that tip!
Was This Post Helpful? 0
  • +
  • -

#4 ianian112  Icon User is offline

  • D.I.C Regular
  • member icon

Reputation: 106
  • View blog
  • Posts: 359
  • Joined: 28-November 09

Re: Hangman: Word not updating

Posted 25 January 2012 - 12:19 PM

View Postjon.kiparsky, on 25 January 2012 - 09:02 AM, said:

Why, why, why, oh, why are you abusing that poor switch?

What about

switch (letter) {
            case "Reset":
                reset();
                break;
            default:
                processLetter(letter);
                btn.setDisable(true);
                break;
}




You could probably even do it a little better, but this chops out 100 lines of code and makes it possible to maintain, so that's some improvement.

I'm afraid I don't see the problem with resetting your textfield. There's some smelly code in there, but I can't track through it all while I'm at work. Sorry.

You cant use switch on Strings in java unless its 7. derp derp

This post has been edited by ianian112: 25 January 2012 - 04:45 PM

Was This Post Helpful? 0
  • +
  • -

#5 jon.kiparsky  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 1719
  • View blog
  • Posts: 3,247
  • Joined: 19-March 11

Re: Hangman: Word not updating

Posted 25 January 2012 - 12:21 PM

I'm assuming that he's in 7, or he'd be asking why his switch doesn't work.
Was This Post Helpful? 4
  • +
  • -

#6 Handler  Icon User is offline

  • D.I.C Head

Reputation: 15
  • View blog
  • Posts: 196
  • Joined: 01-April 10

Re: Hangman: Word not updating

Posted 25 January 2012 - 12:26 PM

Small update: been working on trying to get this to work, updated Hangman.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hangman;

import java.net.URL;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 *
 * @author Alpha
 */
public class Hangman extends Application {

    public static void main(String[] args) {
        launch(args);
    }
    WordHandler words = new WordHandler();
    TextField word = new TextField();
    String dWord = "Press reset";
    Stage primaryStage;
    BorderPane layout;
    ArrayList<Button> btns = new ArrayList();

    @Override
    public void start(Stage primaryStage) {
        loadHang();
        word.setEditable(false);
        this.primaryStage = primaryStage;
        primaryStage.setTitle("Andreas Venter - Hangman");
        primaryStage.setWidth(300);
        primaryStage.setHeight(500);
        primaryStage.setResizable(false);
        StackPane root = new StackPane();
        BorderPane layout = new BorderPane();
        this.layout = layout;

        layout.setCenter(getHang(level));

        VBox hBottom = new VBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");

        HBox vTop = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");
        layout.setBottom(hBottom);

        HBox vCenter = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");


        HBox vBottom = new HBox();
        hBottom.setPadding(new Insets(15, 12, 15, 12));
        hBottom.setSpacing(10);
        hBottom.setStyle("-fx-background-color: #336699");

        hBottom.getChildren().add(vTop);
        hBottom.getChildren().add(vCenter);
        hBottom.getChildren().add(vBottom);
        layout.setBottom(hBottom);


        HBox hTop = new HBox();
        hTop.setPadding(new Insets(15, 12, 15, 12));
        hTop.setSpacing(10);
        hTop.setStyle("-fx-background-color: #FFFFFF");
        layout.setTop(hTop);

        Button btn1 = new Button();
        btn1.setText("Reset");
        btn1.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                processBtn(event);
            }
        });
        hTop.getChildren().add(btn1);

        word.setStyle("-fx-background-color: #C0C0C0");
        word.setText("Press Reset");
        //word.setFont(new Font(24));
        hTop.getChildren().add(word);




        for (int x = 0; x <= 9; x++) {
            Button btn = new Button();
            int y = 65 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vTop.getChildren().add(btn);
            btns.add(btn);
        }
        for (int x = 0; x <= 8; x++) {
            Button btn = new Button();
            int y = 65 + 9 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vCenter.getChildren().add(btn);
            btns.add(btn);
        }
        for (int x = 0; x <= 8; x++) {
            Button btn = new Button();
            int y = 65 + 9 + 8 + x;
            char c = (char) y;
            btn.setText(c + "");

            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent event) {
                    processBtn(event);
                }
            });
            vBottom.getChildren().add(btn);
            btns.add(btn);
        }
        root.getChildren().add(layout);
        primaryStage.setScene(new Scene(root, 300, 250));
        for (Button e : btns) {
            e.setDisable(true);

        }
        primaryStage.show();
    }

    void processBtn(ActionEvent event) {
        Button btn = (Button) event.getSource();
        String letter = btn.getText();

        switch (letter) {
            case "Reset":
                reset();
                break;
            default:
                processLetter(letter);
                btn.setDisable(true);
                break;

        }
        if (level > 9) {
            for (Button e : btns) {
                e.setDisable(true);
                word.setText("Game Over");
            }
        }


    }

    ImageView getHang(int level) {
        ImageView v = new ImageView();
        v.setStyle("-fx-background-color: #FFFFFF");
        v.setImage(hangs[level]);
        v.setFitWidth(200);
        v.setFitHeight(200);
        v.setPreserveRatio(true);

        return v;
    }

    void reset() {
        level = 0;
        for (Button e : btns) {
            e.setDisable(false);
        }

        dWord = words.getWord(7);
        System.out.println("The word: " + dWord);
        String t = "-";

        for (int x = 0; x <= dWord.length() - 1; x++) {
            t.concat("-");
            System.out.println("reset " + x);
        }

        word.setText(dWord);

        layout.setCenter(getHang(level));
    }

    void processLetter(String letter) {
        letter = letter.toLowerCase();
        System.out.println("Letter: "+letter);
        int pos = dWord.indexOf(letter);
        if (pos == -1) {
            level++;
            layout.setCenter(getHang(level));
            return;
        }
        while (true) {
            pos = dWord.indexOf(letter);
            System.out.println("Pos: " + pos);
            dWord.replaceFirst(letter, "-");
            System.out.println("TF: " + word.getText());
            
            char lets[] = word.getText().toCharArray();
            System.out.println("Lets Length: "+lets.length);
            
            lets[pos] = letter.charAt(0);
            String ret = "";
            for (char e : lets) {
                ret.concat(e + "");
            }
            word.setText(ret);
            
            System.out.println("dWord: " + dWord);
            if (pos == -1) {
                return;
            }
        }


    }

    void loadHang() {
        for (int x = 0; x < 11; x++) {

            Image img = new Image(getClass().getResourceAsStream("/resources/hanging/hang" + x + ".gif"));

            hangs[x] = img;
        }
    }
    int level = 0;
    private Image hangs[] = new Image[11];
}



The problem seems to be between reset() and processBtn()
.concat() seems to not work AT ALL :/

EDIT: having major problems with "dWord.replaceFirst(letter, "-");" it seems to not work at all

This post has been edited by Handler: 25 January 2012 - 12:32 PM

Was This Post Helpful? 0
  • +
  • -

#7 ianian112  Icon User is offline

  • D.I.C Regular
  • member icon

Reputation: 106
  • View blog
  • Posts: 359
  • Joined: 28-November 09

Re: Hangman: Word not updating

Posted 25 January 2012 - 12:48 PM

dWord.replaceFirst(letter, "-"); returns the string with the letter replaced so
dWord = dWord.replaceFirst(letter, "-");

This is also true for .concat(String)

This post has been edited by ianian112: 25 January 2012 - 12:49 PM

Was This Post Helpful? 3
  • +
  • -

#8 Handler  Icon User is offline

  • D.I.C Head

Reputation: 15
  • View blog
  • Posts: 196
  • Joined: 01-April 10

Re: Hangman: Word not updating

Posted 25 January 2012 - 12:55 PM

Oops, thank you for pointing that out to me! +1
Was This Post Helpful? 0
  • +
  • -

#9 pbl  Icon User is offline

  • There is nothing you can't do with a JTable
  • member icon

Reputation: 6368
  • View blog
  • Posts: 25,860
  • Joined: 06-March 08

Re: Hangman: Word not updating

Posted 25 January 2012 - 03:40 PM

Just to elaborate on ianian112 correct answer

String are immutable in Java so you cannot change a String (or String content)

All the methods() in the String class that modify a String actually return a new String with the modified String. You can't have a method that modify the String passed as parameter.
Was This Post Helpful? 0
  • +
  • -

#10 jon.kiparsky  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 1719
  • View blog
  • Posts: 3,247
  • Joined: 19-March 11

Re: Hangman: Word not updating

Posted 25 January 2012 - 04:33 PM

Well played.
Was This Post Helpful? 1
  • +
  • -

Page 1 of 1