這是我第一次在這裏發佈,但是自從我開始編程以來,這個社區一直對我有很大的幫助。基本上,我正在製作一個簡單的程序,其中有一些不同的玩家模式。我已經在這個網站上做了一些研究,並通過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;
}
}
}
首先,感謝你對靜態變量的指針。我是新的Java,我知道我已經撿到了一些壞習慣。靜態變量就是其中之一。我當時正在嘗試使用setIcon,但我認爲它不適合我需要做的事情。每次玩家猜錯我需要將相同的圖像添加到GUI。所以,如果有兩個不好的猜測,我需要在GUI上顯示兩個圖像。三個不好的猜測=三個圖像,等等等等。您嘗試新功能的其他指針可能也會出現。 – 2013-04-23 01:27:25