Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel调整图像大小_Java_Graphics - Fatal编程技术网

Java JPanel调整图像大小

Java JPanel调整图像大小,java,graphics,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 Strin

我想做一个简单的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);
        }
    }
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类FoodBoard扩展JPanel实现ActionListener{
私人定时器;
私人活动球;
私人食品[]食品={new Food(),new Food(),new Food(),new Food(),new Food(),
新食品,新食品;
私有内部B_宽度;
私人室内高度;
公众膳食板(){
addKeyListener(新的TAdapter());
挫折背景(颜色:黑色);
设置大小(400300);
setDoubleBuffered(真);
ball=新的活动球();
//WURRY很重要:
设置聚焦(真);
//每隔5毫秒,计时器将调用actionPerformed()方法
定时器=新定时器(5,此);
timer.start();
}
public void addNotify(){
super.addNotify();
B_WIDTH=getWidth();
B_HEIGHT=getHeight();
}
公共无效检查表(){
矩形r3=ball.getBounds();
对于(int j=0;j
您可以像这样调整图像的大小

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

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

yourImage.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);
您可能希望更改newWidth/newHeight参数,但除此之外,您应该可以继续!你可以读更多


希望这有帮助

你离得很近-看一看-你可以选择按比例绘制图像,这可以模拟生长。它可能会被像素化,所以如果需要的话,你可能想加载一个更大分辨率的图像。嗨!我把它放在
checkifeat()
Image im=ball.getImage();im.getScaledInstance(im.getWidth(null)+5,im.getHeight(null)+5,im.SCALE\u默认值)但它什么都不做。我写错地方了吗?谢谢!嗯,我不习惯Java的这一部分,但据我所知,im.SCALE\u DEFAULT是不正确的。SCALE_默认值是Image类中定义的变量,因此当您使用它时,必须执行Image.SCALE_默认值,它应该可以工作。另外,在执行getWidth()时,我认为不必设置空值,但这不会影响您的游戏。问题是,一旦缩放它,我就没有将它设置为球的图像。感谢您的回复:)我现在面临的问题是我在Rustagi的回答中评论的:Pyou's Well welcome:)但是不要在for循环中调整代码的大小,因为这很可能就是它不断调整自身大小的原因。问题是,不应该总是调用它,我在if中编写了它。我被卡住了,我不知道把球放在哪里。我对编程了解不多,但是如果我为每个食物球定义一个事件,“visibilityChanged”或类似的东西,并从那里调用球的方法grow,对吗?嗨。我编写了
Image-prevImage=ball.getImage();setImage(prevImage.getScaleInstance(prevImage.getWidth(null)+10,prevImage.getWidth(null)+10,Image.SCALE_默认值))
在checkifeat()的if中,它会导致球永远变大。有什么想法吗?谢谢您可以检查图像是否已达到最大大小,然后停止增加其大小。见我的编辑。谢谢。你知道为什么它一直在if中执行代码吗?它应该这样做,直到它达到最大大小。我必须找到一种方法,使它不被无休止地调用。否则它总是吃一个球,长大,再也不会长大,因为它达到了最大尺寸。再次感谢!