2013-04-22 37 views
2

這是我第一次在這裏發佈,但是自從我開始編程以來,這個社區一直對我有很大的幫助。基本上,我正在製作一個簡單的程序,其中有一些不同的玩家模式。我已經在這個網站上做了一些研究,並通過API閱讀了一些關於如何實現我堅持的方法的線索。程序中的所有內容都很好,除了每次做出錯誤猜測時需要將圖像添加到GUI的部分。我寫了一個名爲wrongGuess()的方法;它讀入一個.jpg並將其分配給JLabel,但它只會將圖片添加到GUI一次。我對揮杆和AWT非常陌生,發現他們有點令人沮喪。我希望這裏的某個人可以提供一個解決方案,這樣我就可以加深我的知識基礎。我需要讓我的程序每次錯誤的猜測都會在GUI中添加一個.jpg。

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

回答

3

一些建議和問題:

  • 首先,你將要得到你的變量擺脫所有靜態的改性劑。你的Swing GUI應該使用行爲良好的面向對象的代碼,除了少數例外,幾乎沒有什麼地方可以用於靜態變量。
  • 您好像正在考慮在您的圖片JLabel上打電話setIcon(...),但已將其註釋掉。爲什麼?當您希望交換由JLabel顯示的圖像時,這是正確的方法。
  • 當試圖向程序中添加一些新的複雜功能時,我發現通常最好先嚐試讓它在隔離中工作,然後再嘗試將其添加到更大的更復雜的程序中。考慮創建一個更簡單的GUI,其中一個將幾張圖像讀入ImageIcons,然後看看在這個更簡單的程序中是否可以在JButton push上交換圖像。如果你能夠實現它,那麼它應該相當簡單,將這個功能引入到更大的程序中。
  • 請注意,如果圖像不是那麼大,您可以在啓動時將它們全部讀入程序中,並將它們放入ImageIcons中,以便在需要時進行交換。
+1

首先,感謝你對靜態變量的指針。我是新的Java,我知道我已經撿到了一些壞習慣。靜態變量就是其中之一。我當時正在嘗試使用setIcon,但我認爲它不適合我需要做的事情。每次玩家猜錯我需要將相同的圖像添加到GUI。所以,如果有兩個不好的猜測,我需要在GUI上顯示兩個圖像。三個不好的猜測=三個圖像,等等等等。您嘗試新功能的其他指針可能也會出現。 – 2013-04-23 01:27:25

1

我不是在此刻一臺PC,所以我不能運行的代碼,但是這

hangmanPanel.add(graphicsPanel); 

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

流行它在我

基本上,你加graphicsPanelhangmanPanel,默認情況下,在CENTER位置,然後用image標籤覆蓋它,就有效地消除了graphicsPanel

+0

我發現的是,基本上圖像被添加,因爲我希望他們。問題在於它們堆疊在一起。所以看到它們的唯一方法是在添加GUI窗口時更改它們的大小,以便它們在不同的座標處初始化。目前的挑戰是控制添加圖像的方式,以便正確顯示圖像。即不堆疊在彼此之上。 感謝您的反饋。 – 2013-04-23 01:33:19

0

嘗試調用重繪()整個JFrame經過全部修改後才製作完成。

+1

嘿,只是一些反饋給所有試圖幫助我的人。我能夠通過將圖片添加到具有GridLayout的面板來解決此問題。我想感謝每個人的洞察力和時間。 和平。 – 2013-04-23 01:55:48

1

..一個hang子手遊戲。

對於Hang子手,您通常會將所有圖形元素繪製到單個圖像上,然後您可能會在(單個)標籤中顯示。

相關問題