Restart my GUI if button is pressed

19,502

You need to give your class a reset() method that goes through all the necessary fields and resets them to their initial state. There's no one-size fits all solution -- you're just going to have to write the code. This method can then be called by the ActionListener added to your reset JButton.

To make this even possible, any field that needs to be reset must be a field of the class and not a field local to a method or constructor, else it won't be visible to your reset method.


Edit
You state in comment:

my startApp() calls this method, setUp(), so theoretically, shouldnt there be new instances of every variable? and my main problem is that the gui itself is messed up, like it doesnt display fully or properly

I would avoid creating new instances of variables and instead try to re-set the state of class fields as this will be much easier to do, and much easier to maintain and upgrade. If you're doing a wheel of fortune type game though, you will have to re-create some fields, especially the JLabels that display the puzzle, but that's about it. The JPanel that holds this display should not be re-created.


Edit 2
Note that your setUp() and startUp() methods are little more than huge static "god" methods. I strongly advise that you not do this. Create and use non-static fields and methods for your class, and refactor any method that is that big or tries to do too much.

If I were your instructor, I'd advise you to scrap all of this and re-start the program using good OOP principles. You won't regret doing this.


Edit 3
In fact, I would recommend that you subdivide your GUI into separate classes, such as a Wheel class, an AnswerDisplay class, a WrongGuess class, a Player class, and a Game class to run them all, and I'd give each class its own reset() method that is fully responsible for resetting itself. Then all the Game class has to do is call reset() on its constituent parts whenever a reset is required.


Edit 4
Replies to your latest comment:

I see what your saying but to my credit, i do reset all of my vairables as opposed to making new instances of them in all cases except for this last one: trying to restart the entire application - I've gotten a little lazy.

It's not a matter of being lazy, but rather of creating a program that is easy to debug and easy to maintain. Also, I suspect that many of your variables are static, and again, this shouldn't be the case.

I also see what your saying about having "god" methods, but in the case of the setUp(), i need that because a lot of the code is either actionListener's or layout code.

No, you're very wrong on this. Again, if you break down your program into separate classes, your reset button's ActionListener could be as simple as:

resetButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    game.reset();
  }
});

and that's it.

the startApp() could probably be broken down into separate methods but its really not worth it in this scenario.

I'm not trying to be annoying but again you are very wrong. Trust me, I may not be a professional, but I've written many Swing applications, some quite complex, and if you refactor your program as I have suggested, it will be much easier to debug, adapt, enhance and maintain.

Share:
19,502
Louis B
Author by

Louis B

Updated on June 04, 2022

Comments

  • Louis B
    Louis B almost 2 years

    I have a global variable frame, that is a JFrame.

    public static void setUp(final Wheel []player, final phraser p) throws IOException {        
        final JPanel scorePanel=new JPanel();
        final JPanel namePanel=new JPanel();
        panel=new JPanel(new GridLayout(1,player.length,1,1));
        panel1=new JPanel();
        panel2=new JPanel();
        panel3=new JPanel(new GridLayout(2,1,1,1));
    
        panel3.add(new JLabel("Dead letters/phrases:"));
        panel3.add(LettersOrPhGuessed);
        JMenuBar menuBar=new JMenuBar();
        frame.setJMenuBar(menuBar);
        clock=new JMenu();
        JMenu file=new JMenu("File");       
        JMenuItem exit=new JMenuItem("Exit");
        JMenuItem reset=new JMenuItem("Reset");
        file.add(exit);
        file.add(reset);
        menuBar.add(file);
        menuBar.add(clock);
    
        exit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.exit(0);
            }
        });
    
        reset.addActionListener(new ActionListener(){//help me
            public void actionPerformed(ActionEvent e){
                frame.removeAll();
                frame.validate();
                frame.setVisible(false);
                try {
                    startApp();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
    
        //for spinner
        spinQuote.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                if(!first){
                    String result="You have already spun: "+check;
                    JOptionPane.showMessageDialog(null,result);
                }
                else
                    check=player[whichPlayer].spin();
                pause=false;
            }
        });
        //to buy a vowel
        buyVowel.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                buyVow=true;
                if(player[whichPlayer].getPotentialScore()>=250||player[whichPlayer].getTurnScore()>=250){
                    buyVowel(player,whichPlayer,p);
                }
                else
                    JOptionPane.showMessageDialog(null,"Sorry, you don't have enough money to buy a vowel");
                pause=false;
            }
        });
        //to solve baord
        solv.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                pause=false;
                solvBoard=true;
                boolean temp=false;
                while(temp==false){
                    enterSolution();
                    if(cancelAnswer){
                        pause2=false;
                        go=true;
                        return;
                    }
                    else if(guess.equals("-1")){
                        JOptionPane.showMessageDialog(null,"Sorry, you took too long");
                        temp=true;
                    }
                    else if(guess.length()>1){
                        if(p.checkGuessedAnswer(guess))
                            JOptionPane.showMessageDialog(null,"Sorry, that phrase has already been guessed");
                        else if(player[whichPlayer].checkForWin(guess)){
                            newGame=true;
                            replaceCorrectLetter(underScores,guess);
                            player[whichPlayer].setFinalScore(player[whichPlayer].getFinalScore()+player[whichPlayer].getPotentialScore()+player[whichPlayer].getTurnScore());
                            JOptionPane.showMessageDialog(null,"Congrats you won the round!");
                            whichPlayer=0;
                            temp=true;
                        }
                        else{
                            JOptionPane.showMessageDialog(null,"Sorry, better luck next time!");
                            p.addGuessedAnswer(guess);
                            LettersOrPhGuessed.setText(p.getAlreadyGuessed()+"");
                            temp=true;
                        }
                    }
                    else
                        JOptionPane.showMessageDialog(null,"Sorry,That is an invalid guess!");  
                }
                go=false;
                pause2=false;
            }
        });
    
        scorePanel.add(new JLabel("Score Board:"));  
        panel4 = test;
        panel4.setSize(800, 600);//this does nothing in the program
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        namePanel.add(playerName,gbc);
        frame.getContentPane().add(namePanel, gbc);
        frame.getContentPane().add(scorePanel, gbc);
        frame.getContentPane().add(panel, gbc);
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        frame.getContentPane().add(panel4, gbc);
        gbc.weighty = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        frame.getContentPane().add(panel2, gbc); 
        frame.getContentPane().add(panel1, gbc);
        frame.getContentPane().add(panel3, gbc);
        frame.setVisible(true);
    }
    

    startApp method

     public static void startApp() throws IOException{
        howManyPlayers();
        Wheel[] player=new Wheel[numberOfPlayers];
        fixScore(player);
        phraser p=new phraser();
        answer=p.pickPhrase();
        for(int i = 0; i < player.length; i++) {
            player[i] = new Wheel(answer);
        }
        setUp(player,p);
        setName(player);
        scoreBoard(player);
        panel2.add(buyVowel);
        panel2.add(spinQuote);
        panel2.add(solv);
        int gamesplayed=0;
        while(gamesplayed<3){
            if(gamesplayed!=0)
                intializeAnswer(player,p);
            underScores=drawSpaces();
            check=0;
            whichPlayer=0;
            newGame=false;
            test.intializeWheel();
            p.setPositionStart(0);
            while(newGame==false){
                go=true;
                intro(player);
                nextTurn=false;
                cancelGuess=false;
                cancelAnswer=false;
                first=true;
                while(go){
                    int starter=p.getPositionStart();
                    playerName.setText("It is "+player[whichPlayer].getName()+"'s turn!");
                    pause=true;
                    pause2=true;        
                    while(pause){//makes sure user hits spin or solve before it does anything
                        try {
                            Thread.sleep(250);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if (pause==false){
                            if(solvBoard==false&&buyVow==false&&cancelGuess==false)
                                test.spinner(starter,player[whichPlayer].getPosition());//wheel thing
                            break;
                        }
                    }
                    cancelGuess=false;
                    cancelAnswer=false;
                    if(buyVow){buyVow=false;}
                    else if(solvBoard){
                        while(pause2){//makes sure to pause for user
                            try {
                                Thread.sleep(250);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            if (pause2==false)
                                break;
                        }
                        solvBoard=false;
                    }
                    else if(check==-1){
                        JOptionPane.showMessageDialog(null,"Bankrupt!" );
                        player[whichPlayer].setTurnScore(0);
                        player[whichPlayer].setPotentialScore(0);
                        go=false;
                    }
                    else if(check==-2){
                        JOptionPane.showMessageDialog(null,"Sorry, you lost your turn!");
                        player[whichPlayer].setTurnScore(0);
                        go=false;
                    }
                    else if(check==-3){
                        JOptionPane.showMessageDialog(null,"Spin again!");
                    }
                    else{
                        if(first)
                            JOptionPane.showMessageDialog(null,"You spun: "+check);
                        go=interpretAnswer(player,underScores,p);
                    }
                    if(newGame==false)
                        updateScoreBoardInTurn(player);
                    p.setPositionStart(player[whichPlayer].getPosition());
                }
                if(newGame==false){
                    player[whichPlayer].setPotentialScore((player[whichPlayer].getPotentialScore()+player[whichPlayer].getTurnScore()));
                    updateScoreBoard(player);
                    if(whichPlayer==player.length-1)
                        whichPlayer=0;
                    else
                        whichPlayer++;
                }
                player[whichPlayer].setTurnScore(0);
            }
            for(int i=0;i<player.length;i++){
                player[i].setPotentialScore(0);
            }
            updateScoreBoardAfter(player);
            clear(underScores);
            reset(player,p);
            LettersOrPhGuessed.setText(p.getAlreadyGuessed()+"");
            gamesplayed++;
        }
        calcWinner(player);
        results(player);
    }
    

    As you can see, i added an actionListener to my reset button and I'm not sure how to the frame completely restart itself by calling startApp(). My problem is that the frame when i reset it comes back very messed up and nothing works. Any suggestions??

  • Louis B
    Louis B almost 11 years
    my startApp() calls this method, setUp(), so theoretically, shouldnt there be new instances of every variable? and my main problem is that the gui itself is messed up, like it doesnt display fully or properly
  • Louis B
    Louis B almost 11 years
    I see what your saying but to my credit, i do reset all of my vairables as opposed to making new instances of them in all cases except for this last one: trying to restart the entire application - I've gotten a little lazy. I also see what your saying about having "god" methods, but in the case of the setUp(), i need that because a lot of the code is either actionListener's or layout code. the startApp() could probably be broken down into separate methods but its really not worth it in this scenario. Thanks for the input though!
  • Vishal K
    Vishal K almost 11 years
    @HovercraftFullOfEels: +1 Very informative answer..I wish I could have +ed more..
  • Louis B
    Louis B almost 11 years
    Thank you a lot actually, i separated a lot of things into different classes and it is now a lot more organized. my only problem is that because the reset button has an actionListener, at any point in the game a person can hit that button and the problem becomes my application freezes because it is in the middle of doing something else. is there a way to stop my main method when i hit the reset button?
  • Hovercraft Full Of Eels
    Hovercraft Full Of Eels almost 11 years
    @LouisB: you can only do this if you write your code to specifically do this. For instance, if a method takes a while to complete, say a long for loop, you could also check a boolean as part of your for loop exit condition and exit out of the loop if the boolean is true.
  • Hovercraft Full Of Eels
    Hovercraft Full Of Eels almost 11 years
    @LouisB: please see this answer for an example of a program that resets itself.