简体   繁体   English

我的图形有什么问题?

[英]What's wrong with my graphics?

On the first guess, the graphic that's supposed to show up doesn't show. 第一次猜测时,应该显示的图形没有显示。 And on the eighth guess, no graphics show up at all. 关于第八个猜测,根本没有显示任何图形。 (The user is allowed 10 tries before they lose). (允许用户在失败前进行10次尝试)。 Any ideas on why this is happening? 为什么会这样? Help is appreciated! 感谢帮助!

HangmanFigure.java HangmanFigure.java

import java.awt.*;
import javax.swing.*;

public class HangmanFigure extends JPanel {
   private int guesses;
   private Image background;

      public HangmanFigure() {
         super();
         guesses = 0;
         setPreferredSize(new Dimension(400, 400));

         //setting background image to JPEG
         background = Toolkit.getDefaultToolkit().createImage("drac0.jpg");

         //set to true because we want to see the background
         setOpaque(true);
      }

      @Override
      public void paintComponent(Graphics g) {
         super.paintComponent(g);

         g.drawImage(background, 0, 0, null);

         //Testing number of guesses
         System.out.println(guesses);

         //right line
         if(guesses >= 1) {
            background = Toolkit.getDefaultToolkit().createImage("drac1.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //top and slant line
         if(guesses >= 2) {
            background = Toolkit.getDefaultToolkit().createImage("drac2.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //string
         if(guesses >= 3) {
            background = Toolkit.getDefaultToolkit().createImage("drac3.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //head
         if(guesses >= 4) {
            background = Toolkit.getDefaultToolkit().createImage("drac4.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //body
         if(guesses >= 5) {
            background = Toolkit.getDefaultToolkit().createImage("drac5.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //left arm
         if(guesses >= 6) {
            background = Toolkit.getDefaultToolkit().createImage("drac6.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //right hand
         if(guesses >= 7) {
            background = Toolkit.getDefaultToolkit().createImage("drac7.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //left leg
         if(guesses >= 8) {
            background = Toolkit.getDefaultToolkit().createImage("drac8.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //right leg
         if(guesses >= 9) {
            background = Toolkit.getDefaultToolkit().createImage("drac9.jpg");
            g.drawImage(background, 0, 0, null);
         }

         //death face and stake
         if(guesses == 10) {
            background = Toolkit.getDefaultToolkit().createImage("drac10.jpg");
            g.drawImage(background, 0, 0, null);
         }
      }

      public void set() {
         guesses++;
         paintComponent(this.getGraphics());
      }

Here is my MainWindow.java, where I display everything else in the window: 这是我的MainWindow.java,在其中显示窗口中的所有其他内容:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainWindow extends JFrame {
   private int remainingGuesses;
   private String wrongGuesses;
   private String word;
   private String visible;

   public MainWindow(String toGuess) {
      remainingGuesses = 10;
      wrongGuesses = "";
      word = toGuess;

      visible = "";

      for(int i = 0; i < word.length(); ++i) {
         visible += "_ ";
      }

      JPanel corePanel = new JPanel();
      corePanel.setLayout(new BorderLayout());

      final JLabel status = new JLabel("You have "+remainingGuesses+" remaining", SwingConstants.CENTER);
      final JLabel wrong = new JLabel("Wrong guesses so far: "+wrongGuesses);
      final JLabel visibleLabel = new JLabel(visible, SwingConstants.CENTER);
      final JTextField input = new JTextField();

      JPanel southPanel = new JPanel(new GridLayout(4, 1));
      southPanel.add(status);
      southPanel.add(visibleLabel);
      southPanel.add(input);
      southPanel.add(wrong);

      corePanel.add(southPanel, BorderLayout.SOUTH);

      final HangmanFigure hf = new HangmanFigure();
      corePanel.add(hf, BorderLayout.CENTER);

      this.add(corePanel, BorderLayout.CENTER);

      input.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            String text = input.getText();

            if(text.length()  == 1 && text.matches("[a-z]")) {
               boolean guessFound = false;

               for(int i = 0; i < word.length(); ++i) {
                  if(text.charAt(0) == word.charAt(i)) {
                     guessFound = true;

                     String newVisible = "";

                     for(int j = 0; j < visible.length(); ++j) {
                        if(j == (i*2)) {
                           newVisible += word.charAt(i);
                        }
                        else {
                           newVisible += visible.charAt(j);
                        }
                     }
                     visible = newVisible;
                     visibleLabel.setText(visible);
                  }
               }

               if(!guessFound) {
                  if(--remainingGuesses > 0) {
                     status.setText("You have "+remainingGuesses+" guesses remaining");
                     wrongGuesses += text+" ";
                     wrong.setText("Wrong guesses so far: "+wrongGuesses);
                     hf.set();
                  }
                  else {
                     status.setText("You lost: the word was "+word);
                     input.setEnabled(false);
                  }
               }
               else {
                  String actualVisible = "";
                  for(int i = 0; i < visible.length(); i+=2) {
                     actualVisible += visible.charAt(i);
                  }

                  if(actualVisible.equals(word)) {
                     status.setText("Congratulations, you have won!");
                     input.setEnabled(false);
                  }
               }
            }
            else {
               //displays a dialogue box if user inputs anything other than lowercase letter.
               JFrame frame = new JFrame();
               JOptionPane.showMessageDialog(frame, "Please enter a lowercase letter!", "Inane warning", JOptionPane.WARNING_MESSAGE);
            }

            input.setText("");
         }
      });

      this.pack();
      this.setLocationRelativeTo(null);
      this.setTitle("Hangman");
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);
   }

   public static void main(String[] args) {
      new MainWindow("cat");
   }
}

May not be the right / best way to handle this, I don't have any experience with Java Graphics. 可能不是解决此问题的正确/最佳方法,我对Java Graphics没有任何经验。 But, I looked at the drawImage function, and it returns true when the image is ready. 但是,我看了一下drawImage函数,当图像准备好时它返回true。 So I tried wrapping the calls in a while loop, and now it draws all images. 因此,我尝试将调用包装在while循环中,现在它绘制了所有图像。

while(!g.drawImage(background, 0, 0, null));

See API reference 请参阅API参考

Sample with your IF statement: 带有IF语句的示例:

  try {

     .....

     if(guesses >= 1) {
        background = Toolkit.getDefaultToolkit().createImage("drac1.jpg");
        // old code - g.drawImage(background, 0, 0, null);
        while(!g.drawImage(background, 0, 0, null)) Thread.sleep(100); // - new code
     }

     if(guesses >= 2) {
        background = Toolkit.getDefaultToolkit().createImage("drac2.jpg");
        // old code - g.drawImage(background, 0, 0, null);
        while(!g.drawImage(background, 0, 0, null)) Thread.sleep(100); // - new code
     }

     .....

    } catch(InterruptedException ex) {
       ex.printStackTrace();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM