2

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 メソッド

 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);
}

ご覧のとおり、actionListener をリセット ボタンに追加しましたが、startApp() を呼び出してフレームを完全に再起動する方法がわかりません。私の問題は、リセットしたときにフレームがめちゃくちゃになって戻ってきて、何も機能しないことです。助言がありますか??

4

2 に答える 2

6

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.

于 2013-06-23T17:45:21.703 に答える
0

Java で TicTacToe ゲーム インターフェイス GUI をリセットするために使用した Reset メソッドの例を次に示します。

 Code for TicTacToe game
 GameInterface contains the GUI
 Decide class decides who wins.
 l1,l2,l3 are the labels to the buttons pressed
 p1,p2 are the player turns

    import javax.swing.*;
     public class Main1{
       initValues();
       public static gameinterface g;
       public static Decide d;
        public static int p1,p2,l1,l2,l3,l4,l5,l6,l7,l8,l9;
public static void main(String[] args){

    JOptionPane.showMessageDialog(null,"Player1: Red \n Player 2: Green \n Start Playing");
         g= new gameinterface();
         d= new Decide();
}
//Restart Method initialize new GUI like it does in Main Method.
//Also reset the label values so the player turns to default and Buttons 
 //data is restored to default         
public static void restart(){
   g=new gameinterface();
    initValues();
}
//Set Player turn and Labels to default like no button is pressed
public static void initValues(){
    p2=0; p1=1; l1=0; l2=0; l3=0;l4=0;l5=0; l6=0; l7=0; l8=0; l9=0;
}

}

于 2016-05-21T07:09:19.577 に答える