2

ここに投稿するのは初めてですが、プログラミングを始めて以来、このコミュニティは私にとって大きな助けになっています。基本的に、ハングマン ゲームのいくつかの異なるプレイ モードを持つ単純なプログラムに取り組んでいます。私はこのサイトでいくつかの調査を行い、API を読んで、私が行き詰まっているメソッドを実装する方法についての手がかりを得ました。間違った推測が行われるたびに GUI にイメージを追加する必要がある部分を除いて、プログラムのすべてがうまく機能します。私は wrongGuess(); というメソッドを書きました。.jpg を読み込んで JLabel に割り当てますが、画像を GUI に追加するのは 1 回だけです。私はswingとAWTに非常に慣れていないため、少しイライラしています。ここで誰かが解決策を提供して、知識ベースを少し深めることができることを願っています.

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


public class GUI {

       private static String lettersFileName;
       private static String playerType;
       private static char guess;
       private static String guessString;
       private static HangmanPlayer aiPlayer;
       private static hangmanLogic hangmanGame;
       private final JPanel hangmanPanel = new JPanel(new BorderLayout());
       private JPanel graphicsPanel = new JPanel(new GridLayout());

       //Constructor
       GUI(String playerType, String lettersFileName, hangmanLogic hangmanGame){
           GUI.playerType = playerType;
           GUI.lettersFileName = lettersFileName;
           GUI.hangmanGame = hangmanGame;   
       }

   /**
     * Private listener subclass that allows a user to initiate a guess
     * The action is specific to the type of player (i.e. systematic AI,
     * random AI, or a human player)
     */
    public void drawGUI() {
        //Constructs AI player if applicable

        if (playerType.equals("s"))

        {

           aiPlayer = new SystematicPlayer(lettersFileName); 

        }

        else if (playerType.equals("r"))

        {

           aiPlayer = new RandomPlayer(lettersFileName); 

        }


      //Constructs a hangmanFrame
      HangmanFrame hangmanFrame = new HangmanFrame(500, 500);

      //Main section
      final JPanel mainPanel = new JPanel(new GridLayout(1, 2));

      //Title section
      final JPanel titlePanel = new JPanel();
      titlePanel.setBackground(new Color(40, 40, 40));
      final JLabel title = new JLabel("Let's Hang Out...");
      title.setFont(new Font("Helvetica", Font.BOLD, 18));
      title.setHorizontalAlignment(JLabel.CENTER);
      title.setForeground(Color.WHITE);
      titlePanel.add(title);

      //Left border section
      final JPanel leftBorderPanel = new JPanel();
      leftBorderPanel.setBackground(new Color(40, 40, 40));

      //Right border section
      final JPanel rightBorderPanel = new JPanel();
      rightBorderPanel.setBackground(new Color(40, 40, 40));

      //Hangman section (left sub-section)
      //final JPanel hangmanPanel = new JPanel(new BorderLayout());
      hangmanPanel.setBackground(new Color(120, 120, 120));
      final JLabel hangmanTopCommentLabel = new JLabel("To Start Playing");
      hangmanTopCommentLabel.setFont(new Font("Helvetica", Font.BOLD, 16));
      hangmanTopCommentLabel.setHorizontalAlignment(JLabel.CENTER);
      hangmanTopCommentLabel.setForeground(Color.WHITE);
      hangmanPanel.add(hangmanTopCommentLabel, BorderLayout.NORTH);


      hangmanPanel.add(graphicsPanel);





      //Set images up for display   
      final JLabel image = new JLabel();
      hangmanPanel.add(image, BorderLayout.CENTER);


      final JLabel hangmanBottomCommentLabel = new JLabel();
      hangmanBottomCommentLabel.setFont(new Font("Helvetica", Font.BOLD, 16));
      hangmanBottomCommentLabel.setHorizontalAlignment(JLabel.CENTER);
      hangmanBottomCommentLabel.setForeground(Color.WHITE);
      hangmanPanel.add(hangmanBottomCommentLabel, BorderLayout.SOUTH);

      //Right sub-section
      final JPanel rightSubPanel = new JPanel(new GridLayout(3,1));

      //Revealed phrase section
      final JPanel phrasePanel = new JPanel(new BorderLayout());
      phrasePanel.setBackground(new Color(230, 230, 230));
      phrasePanel.setBorder(BorderFactory.createLineBorder(Color.black));
      final JLabel phraseTitleLabel = new JLabel("Revealed Phrase");
      phraseTitleLabel.setFont(new Font("Helvetica", Font.BOLD, 16));
      phraseTitleLabel.setHorizontalAlignment(JLabel.CENTER);
      phrasePanel.add(phraseTitleLabel, BorderLayout.NORTH);
      final JLabel phraseLabel = new JLabel(hangmanGame.getRevealedKeyPhrase());
      phraseLabel.setFont(new Font("Helvetica", Font.BOLD, 20));
      phraseLabel.setHorizontalAlignment(JLabel.CENTER);
      phraseLabel.setForeground(new Color(196, 0, 0));
      phrasePanel.add(phraseLabel, BorderLayout.CENTER);

      //Already guessed letters section
      final JPanel alreadyGuessedPanel = new JPanel(new BorderLayout());
      alreadyGuessedPanel.setBackground(new Color(230, 230, 230));
      alreadyGuessedPanel.setBorder(
            BorderFactory.createLineBorder(Color.black));
      final JLabel alreadyGuessedTitleLabel = new JLabel(
            "Already Guessed Letters");
      alreadyGuessedTitleLabel.setFont(new Font("Helvetica", Font.BOLD, 16));
      alreadyGuessedTitleLabel.setHorizontalAlignment(JLabel.CENTER);
      alreadyGuessedPanel.add(alreadyGuessedTitleLabel, BorderLayout.NORTH);
      final JTextArea alreadyGuessedLabel = new JTextArea("");
      alreadyGuessedLabel.setFont(new Font("Helvetica", Font.BOLD, 22));
      alreadyGuessedLabel.setBackground(new Color(230, 230, 230));
      alreadyGuessedLabel.setLineWrap(true);
      alreadyGuessedLabel.setEditable(false);
      alreadyGuessedPanel.add(alreadyGuessedLabel, BorderLayout.CENTER);

      //Guesses remaining section
      final JPanel guessesRemaining = new JPanel(new BorderLayout());
      guessesRemaining.setBackground(new Color(230, 230, 230));
      guessesRemaining.setBorder(BorderFactory.createLineBorder(Color.black));
      final JLabel guessesRemainingTitleLabel = new JLabel("Guesses Remaining");
      guessesRemainingTitleLabel.setFont(new Font("Helvetica", Font.BOLD, 16));
      guessesRemainingTitleLabel.setHorizontalAlignment(JLabel.CENTER);
      guessesRemaining.add(guessesRemainingTitleLabel, BorderLayout.NORTH);
      final JLabel guessesRemainingLabel = new JLabel(Integer.toString(
            hangmanGame.getnumberOfGuessesRemaining()));
      guessesRemainingLabel.setFont(new Font("Helvetica", Font.BOLD, 60));
      guessesRemainingLabel.setHorizontalAlignment(JLabel.CENTER);
      guessesRemaining.add(guessesRemainingLabel, BorderLayout.CENTER);

      //Guess input section
      final JPanel guessInputPanel = new JPanel(new FlowLayout());    
      guessInputPanel.setBackground(new Color(40, 40, 40));
      JButton guessButton = new JButton("Guess!");
      guessButton.setBackground(new Color(230, 230, 230));
      guessButton.setBorderPainted(false);
      guessButton.setForeground(new Color(196, 0, 0));
      final JLabel playerTypeLabel = new JLabel();
      playerTypeLabel.setFont(new Font("Helvetica", Font.BOLD, 14));
      playerTypeLabel.setHorizontalAlignment(JLabel.LEFT);
      playerTypeLabel.setForeground(Color.WHITE);
      final JTextField guessField = new JTextField(10);
      guessInputPanel.add(playerTypeLabel);

      //Nests panels
      mainPanel.add(hangmanPanel);
      rightSubPanel.add(phrasePanel);
      rightSubPanel.add(alreadyGuessedPanel);
      rightSubPanel.add(guessesRemaining);
      mainPanel.add(rightSubPanel);

      //Modifies specific components to fit the player type
      if (playerType.equalsIgnoreCase("s"))
      {
         playerTypeLabel.setText(("Systematic AI Player"));
         hangmanBottomCommentLabel.setText(("Press Guess"));
         guessInputPanel.add(guessButton);
      }
      else if (playerType.equalsIgnoreCase("r"))
      {
         playerTypeLabel.setText(("Random AI Player"));
         hangmanBottomCommentLabel.setText(("Press Guess"));
         guessInputPanel.add(guessButton);
      }
      else if (playerType.equalsIgnoreCase("h"))
      {
         playerTypeLabel.setText(("Human Player"));
         hangmanBottomCommentLabel.setText(("Enter A Guess"));
         guessInputPanel.add(guessField);
         guessInputPanel.add(guessButton);

         /**
          * Private listener subclass that selects all text
          * in the guessField when it receives a mouse click
          *
          */
         class GuessFieldMouseListener implements MouseListener
         {
            public void mousePressed(MouseEvent event)
            { 
               //Selects all text
               guessField.requestFocus();
               guessField.selectAll();

            }
            @Override
            public void mouseClicked(MouseEvent event)
            {
               // TODO Auto-generated method stub 
            }
            @Override
            public void mouseEntered(MouseEvent event)
            {
               // TODO Auto-generated method stub
            }
            @Override
            public void mouseExited(MouseEvent event)
            {
               // TODO Auto-generated method stub
            }
            @Override
            public void mouseReleased(MouseEvent event)
            {
               // TODO Auto-generated method stub  
            }
         }

         //Adds guessFieldListener to guessField
         MouseListener guessFieldListener = new GuessFieldMouseListener();
         guessField.addMouseListener(guessFieldListener);
      }

      /**
       * Private listener subclass that allows a user to initiate a guess
       * The action is specific to the type of player (i.e. systematic AI,
       * random AI, or a human player)
       */
      class GuessActionListener implements ActionListener
      {
         public void actionPerformed(ActionEvent event)
         {  
            /* 
             * Accepts a guess from a given player type and assigns guessString
             * (s - AI systematic, r - AI random, or h - human)
             * and determines if the guess is part of the key phrase
             */
               if (playerType.equals("s"))
               {
                  guess = aiPlayer.makeGuess();  

                  guessString = Character.toString(guess).toUpperCase();
               }
               else if (playerType.equals("r"))
               {
                  guess = aiPlayer.makeGuess(); 

                  guessString = Character.toString(guess).toUpperCase();
               }
               else if (playerType.equals("h"))
               {
                  guess = guessField.getText().charAt(0);

                  guessString = Character.toString(guess).toUpperCase();
               }
               //Determines if the game is already over
               if (!hangmanGame.isGameOver())
               {
                  try
                  {  
                     //Determines if the guess is part of the key phrase
                     if (hangmanGame.guessCharacter(guess))
                     {  
                        //Determines if the current guess ended the game
                        if (hangmanGame.isGameOver())
                        {
                           if (hangmanGame.getKeyPhrase().equals(
                                 hangmanGame.getRevealedKeyPhrase()))
                           {
                              //Updates comment labels
                              hangmanTopCommentLabel.setText("You Win!!!");
                              hangmanBottomCommentLabel.setText("Game Over!");
                           }
                           else
                           {
                              //Updates comment labels
                              hangmanTopCommentLabel.setText("You Lose!!!");
                              hangmanBottomCommentLabel.setText("Game Over!");
                           }
                        }
                        else
                        {
                           //Updates comment labels
                           hangmanTopCommentLabel.setText("Current Guess: " +
                                 guessString);
                           hangmanBottomCommentLabel.setText("CORRECT!");  

                           //image.setIcon( new ImageIcon("madBro.jpg") );



                        }
                     }
                     else
                     {
                        if (hangmanGame.isGameOver())
                        {
                           //Updates comment labels
                           if (hangmanGame.getKeyPhrase().equals(
                                 hangmanGame.getRevealedKeyPhrase()))
                           {
                              hangmanTopCommentLabel.setText("You Win!!!");
                              hangmanBottomCommentLabel.setText("Game Over!");
                           }
                           else
                           {
                              hangmanTopCommentLabel.setText("You Lose!!!");
                              hangmanBottomCommentLabel.setText("Game Over!");
                           }
                        }
                        else
                        {
                           //Updates comment labels
                           hangmanTopCommentLabel.setText("Current Guess: " +
                                 guessString);
                           hangmanBottomCommentLabel.setText("WRONG!");




                           //image.setIcon( new ImageIcon("realMad.jpg") );
                           wrongGuess();    


                        }
                     }

                     //Updates guessesReaminingLabel and phraseLabel
                     guessesRemainingLabel.setText(
                           Integer.toString(
                                 hangmanGame
                                 .getnumberOfGuessesRemaining()));
                     phraseLabel.setText(
                           hangmanGame.getRevealedKeyPhrase());

                     /* 
                      * Allows the alreadyGuessedLabel to be updated
                      * with a comma delimited list of the already
                      * guessed characters
                      */
                     if (alreadyGuessedLabel.getText().equals(""))
                     {
                        alreadyGuessedLabel.setText(
                              alreadyGuessedLabel.getText() + " " +
                                    guessString);
                     }
                     else
                     {
                        alreadyGuessedLabel.setText(
                              alreadyGuessedLabel.getText() +
                              ", " + guessString);
                     }
                  }
                  catch (InvalidInputException e)
                  {
                     //Updates comment labels
                     hangmanTopCommentLabel.setText("Current Guess: " +
                           guessString);
                     hangmanBottomCommentLabel.setText("Invalid Input!");

                  }
                  catch (AlreadyGuessedException e){
                     //Updates comment labels
                     hangmanTopCommentLabel.setText("Current Guess: " +
                           guessString);
                     hangmanBottomCommentLabel.setText("Already Guessed!");
                  }
               }
               else
               {
                  //Updates comment labels
                  hangmanTopCommentLabel.setText("The Game is Over!");
                  hangmanBottomCommentLabel.setText("Give It Up!");
               }
         }
      }

      //Adds guessListener to guessButton
      ActionListener guessListener = new GuessActionListener();
      guessButton.addActionListener(guessListener);

      //Adds components to the frame
      hangmanFrame.add(titlePanel, BorderLayout.NORTH);
      hangmanFrame.add(leftBorderPanel, BorderLayout.WEST);
      hangmanFrame.add(mainPanel, BorderLayout.CENTER);
      hangmanFrame.add(rightBorderPanel, BorderLayout.EAST);
      hangmanFrame.add(guessInputPanel, BorderLayout.SOUTH);

      //Makes the hangman GUI visible
      hangmanFrame.setVisible(true);
   }

    /**
     * Adds new graphic representation for each wrong guess made
     */
    private void wrongGuess()
    {
        ImageIcon broMad = createImageIcon("madBro.jpg");
        JLabel wrong = new JLabel(broMad);
        graphicsPanel.add(wrong);
    }
    /**
     * Method for creating an image icon, found in Oracle.com's knowledge base
     * @param path location of desired image file
     * @return Icon, or null if path not found
     */
    private ImageIcon createImageIcon(String path) 
    {
        java.net.URL imgURL = getClass().getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            JOptionPane.showMessageDialog(null,
                    "Couldn't find file: " + path);
            return null;
        }
    }
}
4

4 に答える 4

3

いくつかのアドバイスと質問:

  • 何よりもまず、変数のすべての静的修飾子を取り除きたいと思うでしょう。Swing GUI は適切に動作するオブジェクト指向コードを使用する必要があり、いくつかの例外を除いて、静的変数の場所はほとんどありません。
  • イメージ JLabelを呼び出すことを検討しているようですsetIcon(...)が、コメントアウトしています。なんで?これは、JLabel によって表示される画像を交換したい場合に使用する正しい方法です。
  • 新しい複雑な機能をプログラムに追加しようとするとき、通常は、より大きな複雑なプログラムに追加する前に、最初にその機能を分離して動作させるのが最善であることがわかりました。いくつかの画像を ImageIcons に読み込む、はるかに単純な GUIを作成することを検討し、この単純なプログラムで JButton プッシュで画像を交換できるかどうかを確認してください。機能するようになれば、この機能をより大きなプログラムに持ち込むのはかなり簡単です。
  • 画像がそれほど大きくない場合は、起動時にすべてをプログラムに読み込み、必要に応じて交換できる ImageIcons に配置できます。
于 2013-04-22T21:57:16.127 に答える
1

現時点では PC を使用していないため、コードを実行できませんが、これは

  hangmanPanel.add(graphicsPanel);

  //Set images up for display   
  final JLabel image = new JLabel();
  hangmanPanel.add(image, BorderLayout.CENTER);

私にそれをポップ

基本的に、デフォルトでは位置に を追加graphicsPanelし、それをラベルで上書きして効果的に削除しますhangmanPanelCENTERimagegraphicsPanel

于 2013-04-22T22:01:04.590 に答える
0

すべての変更が行われた後、JFrame 全体で repaint() を呼び出してみてください。

于 2013-04-22T22:02:51.017 に答える