java的挑随机图像(java pick random images)

2019-09-29 06:16发布

英语不是我的母语,对不起任何错误。 我不得不在Java中的泡沫射击游戏。 我想用影像的泡沫,我想被随机挑选的图片。 我用RandomImageIcon类。 当我编译它,我不知道问题出在哪里我的程序不显示任何东西。 我在的Java初学者。

这是我的游戏类的代码:

import java.awt.Graphics;
import java.awt.Image;
import java.util.Vector;

import javax.swing.JPanel;

public class Game extends JPanel{
  private static final long serialVersionUID = 1L;

  //what the balls are like
  public final static int START_BALLS=40;
  public static Vector<Ball> balls = new Vector<Ball>();
  private Image img;
  private Graphics graphics;

  public Game() {
    for(int i=0; i<START_BALLS; i++) {
      balls.add(new Ball());
    }
  }

  public void paint(Graphics g) {
    img = createImage(null);
    graphics = img.getGraphics();
    paintComponent(graphics);
    g.drawImage(img, 0, 0, null);
    repaint();
  }

  public void paintComponet(Graphics g) {
    for(int i=0; i<balls.size(); i++) {
      Ball b=(Ball)balls.get(i);
      b.draw(g);
    }
  }

  public static void main(String [] args) {
    new Frame();
    Game game = new Game();
    new Game();
    Window.window.add(game);
  }
}

和类气泡:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;

import javax.swing.ImageIcon;

public class Ball {
  Random random = new Random();
  final String[] image_paths = new String[] {"balls/peg_0.png",
            "balls/peg_1.png","balls/peg_2.png","balls/peg_3.png",
            "balls/peg_4.png","balls/peg_5.png"};

  String randomBalls;
  public Image image;

  public Ball(){
    randomBalls = image_paths[random.nextInt(image_paths.length)];
    ImageIcon poza = new ImageIcon(randomBalls);
    image=poza.getImage();
  }

  public void draw(Graphics g){
    g.drawImage(image, 0, 0, null, null);
  }
}

什么是错我的程序?

Answer 1:

查看我的意见,在代码中的注释仔细看,看我如何重新排列类的组织。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.imageio.ImageIO;
import java.net.URL;

public class Game extends JPanel {

    Random random = new Random();
    final String[] image_path = new String[]{
        "http://i.stack.imgur.com/gJmeJ.png",
        "http://i.stack.imgur.com/IHARa.png",
        "http://i.stack.imgur.com/wCF8S.png",
        "http://i.stack.imgur.com/T5uTa.png"
    };
    private static final long serialVersionUID = 1L;
    //what the balls are like
    public final static int START_BALLS = 40;
    public static Vector<Ball> balls = new Vector<Ball>();
    private Image img;
    // A Graphics instance is typically transient.
    // There is rarely, if ever, a need to store them
    //private Graphics graphics;

    public Game() {
        for (int i = 0; i < image_path.length; i++) {
            balls.add(new Ball(image_path[i]));
        }
        //I have no idea what you were trying to achieve here, but it fails horribly
        // img = createImage(null);
        img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        // graphics = img.getGraphics();
        ActionListener al = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        };
        Timer timer = new Timer(400, al);
        timer.start();
    }

    @Override  // very handy!
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // g.drawImage(img, 0, 0, null);  A JPanel IS A ImageObserver
        g.drawImage(img, 0, 0, this);
        Ball b = (Ball) balls.get(random.nextInt(4));
        b.draw(g);
    }

    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Game");
                f.add(new Game());
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See https://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

class Ball {

    String randomBalls;
    public Image image;

    public Ball(String url) {
        try {
            image = ImageIO.read(new URL(url));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        g.drawImage(image, 0, 0, null, null);
    }
}

提示

  • Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer) at img = createImage(null); 我不知道你觉得代码语句的做法,但..nothing好。
  • 当在做风俗画JPanel ,我们应该只重写paintComponent(Graphics) ,并留下了paint(Graphics)方法,因为它是。 当重写前者,立即调用超级方法。
  • 添加调用repaint()paint(Graphics)会导致无限循环。如果代码需要循环,建立一个Swing计时器来调用repaint()
  • paintComponet(Graphics g)paintComponent(Graphics g)使用@Override符号在适当的时候。 它会提醒你拼错方法名。

更多一般性的提示

  1. 为了更好地帮助越早,张贴MCVE 。
  2. 得到的图像(S)为例的一种方法是热链接中看到的图像这个答案 。
  3. 通过部署时,这些图像将有可能成为一个嵌入式的资源 。 既然如此,就必须通过访问URL ,而不是File 。 请参阅信息页面的标签,一种方式来形成URL


文章来源: java pick random images