Java JPanel调整Image大小

时间:2013-11-01 12:37:42

标签: java graphics

我正在尝试制作一个简单的Java游戏,其中一个大球吃较小的球。我做到了现在我希望大球在吃小球时“成长”,但我不知道如何用Java重新调整图像大小。提前谢谢!

MovableBall.java:

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class MovableBall {

    private String craft = "ball.png";

    private int dx;
    private int dy;
    private int x;
    private int y;
    private int width;
    private int height;
    private int mx = 200, my = 150;
    private Image image;

    public MovableBall() {
        ImageIcon ii = new ImageIcon(this.getClass().getResource(craft));
        image = ii.getImage();

        x = 5;
        y = 5;
        width = image.getWidth(null);
        height = image.getHeight(null);
    }

    public void move() {
        x += dx;

        y += dy;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Image getImage() {
        return image;
    }

    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
        }

        if (key == KeyEvent.VK_UP) {
            dy = -1;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 1;
        }
    }

    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_UP) {
            dy = 0;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 0;
        }
    }

    public Rectangle getBounds() {
        return new Rectangle(x, y, width, height);
    }
}

FoodBoard.java:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;
import javax.swing.Timer;

public class FoodBoard extends JPanel implements ActionListener {

    private Timer timer;
    private MovableBall ball;
    private Food[] foods = { new Food(), new Food(), new Food(), new Food(),
            new Food(), new Food() };
    private int B_WIDTH;
    private int B_HEIGHT;

    public FoodBoard() {
        addKeyListener(new TAdapter());
        setBackground(Color.black);
        setSize(400, 300);
        setDoubleBuffered(true);
        ball = new MovableBall();

        // WURRY important:
        setFocusable(true);
        // every 5 ms the timer will call the actionPerformed() method
        timer = new Timer(5, this);
        timer.start();
    }

    public void addNotify() {
        super.addNotify();
        B_WIDTH = getWidth();
        B_HEIGHT = getHeight();
    }

    public void checkIfEaten() {
        Rectangle r3 = ball.getBounds();

        for (int j = 0; j < foods.length; j++) {
            Food a = foods[j];
            Rectangle r2 = a.getBounds();

            if (r3.intersects(r2)) {
                a.setVisible(false);
            }
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        for (int i = 0; i < foods.length; i++) {
            Food f = foods[i];
            if (f.isVisible()) {
                g2d.drawImage(f.getImage(), f.getX(), f.getY(), this);
            }
        }
        g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(), this);

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        ball.move();
        checkIfEaten();
        repaint();
    }

    private class TAdapter extends KeyAdapter {
        public void keyReleased(KeyEvent e) {
            ball.keyReleased(e);
        }

        public void keyPressed(KeyEvent e) {
            ball.keyPressed(e);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你可以调整像这样的图像,

Image new_image = old_image.getScaledInstance( new_width, new_height,  java.awt.Image.SCALE_SMOOTH ) ;

确保球不超过最大尺寸,

if(prevImage.getWidth(null) >= max_width || prevImage.getHeight(null) >= max_height)
{
    System.out.println("MAX Size reached !");
}
else
{
    // increase the size
    Image new_image = old_image.getScaledInstance( new_width, new_height,  java.awt.Image.SCALE_SMOOTH ) ;
}

答案 1 :(得分:1)

如果你有一个Image对象,你真的不需要担心它的大小,只需使用

yourImage.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);

你想要改变newWidth / newHeight参数,但除此之外,你应该好好去!您可以阅读更多here.

希望这有帮助!