Java-使用方法和构造函数绘制图形

Java-使用方法和构造函数绘制图形,java,graphics,Java,Graphics,我正在开发一个java 2d游戏库。每次调用paintImage时,我都需要一个名为paintImage的方法来执行graphics.drawImage public void paintImage(image1, x, y){ //i want it to run graphics.drawImage every time it is called. } public void anotherMethod(){ paintIma

我正在开发一个java 2d游戏库。每次调用paintImage时,我都需要一个名为paintImage的方法来执行graphics.drawImage

public void paintImage(image1, x, y){        
    //i want it to run graphics.drawImage every time it is called.        
}

public void anotherMethod(){        
    paintImage(...);
    paintImage(...);
    //paint as many times as i want.        
}

public void paintComponent(Graphics graphics){
    graphics.drawImage();
    super.paintComponents();
} 
谢谢你的时间,请留下一个建议,很抱歉,这很难解释

用于单图像显示

更新:用于多图像显示

输出: 看看这个 如果您不了解任何内容,请发表评论,希望这对单幅图像显示有所帮助

更新:用于多图像显示

输出: 看看这个
评论如果你什么都不懂,希望这能对你有所帮助。我想你要做的是对你的类中的一些状态进行更改,然后根据这些状态的更改重新绘制你的图像——换句话说,也许你想做动画。如果是这样,则所有图像绘制都应该在使用其图形对象的paintComponent方法中完成,或者在paintComponent调用的另一个方法中完成,该方法使用传递到PaintCoCalzComponent的图形对象。这可以通过将图形参数传递到另一个方法中来实现。然后,您的anotherMethod将通过调用repaint请求JVM重新绘制GUI。例如:

public void anotherMethod() {
    x++;
    y++;
    repaint(); // this will stimulate JVM to call paint/paintComponent
}

private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
    g.drawImage(img, x, y2, this);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    paintImage(g, image1, x, y);
}
这方面的完整示例如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.Transient;

import javax.swing.*;

public class PaintEg extends JPanel {

    private static final int IMG_W = 30;
    private static final int IMG_H = IMG_W;
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int TIMER_DELAY = 20;
    private BufferedImage image1;
    private int x;
    private int y;

    public PaintEg() {
        image1 = createImg();
        new Timer(TIMER_DELAY, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                anotherMethod();
            }
        }).start();
    }

    private BufferedImage createImg() {
        BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setBackground(Color.red);
        g2.clearRect(0, 0, IMG_W, IMG_H);
        g2.setColor(Color.blue);
        g2.fillRect(IMG_W / 4, IMG_H / 4, IMG_W / 2, IMG_H / 2);
        g2.dispose();
        return img;
    }

    public Dimension getPreferredSize() {
        return new Dimension(PREF_W, PREF_H);
    }

    public void anotherMethod() {
        x++;
        y++;
        repaint(); // this will stimulate JVM to call paint/paintComponent
    }

    private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
        g.drawImage(img, x, y2, this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintImage(g, image1, x, y);
    }


    private static void createAndShowGUI() {
        PaintEg paintEg = new PaintEg();

        JFrame frame = new JFrame("PaintEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(paintEg);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

我认为你要做的是对你的类中的一些状态进行更改,然后根据这些状态的更改重新绘制你的图像——换句话说,也许你要做动画。如果是这样,则所有图像绘制都应该在使用其图形对象的paintComponent方法中完成,或者在paintComponent调用的另一个方法中完成,该方法使用传递到PaintCoCalzComponent的图形对象。这可以通过将图形参数传递到另一个方法中来实现。然后,您的anotherMethod将通过调用repaint请求JVM重新绘制GUI。例如:

public void anotherMethod() {
    x++;
    y++;
    repaint(); // this will stimulate JVM to call paint/paintComponent
}

private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
    g.drawImage(img, x, y2, this);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    paintImage(g, image1, x, y);
}
这方面的完整示例如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.Transient;

import javax.swing.*;

public class PaintEg extends JPanel {

    private static final int IMG_W = 30;
    private static final int IMG_H = IMG_W;
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;
    private static final int TIMER_DELAY = 20;
    private BufferedImage image1;
    private int x;
    private int y;

    public PaintEg() {
        image1 = createImg();
        new Timer(TIMER_DELAY, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                anotherMethod();
            }
        }).start();
    }

    private BufferedImage createImg() {
        BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setBackground(Color.red);
        g2.clearRect(0, 0, IMG_W, IMG_H);
        g2.setColor(Color.blue);
        g2.fillRect(IMG_W / 4, IMG_H / 4, IMG_W / 2, IMG_H / 2);
        g2.dispose();
        return img;
    }

    public Dimension getPreferredSize() {
        return new Dimension(PREF_W, PREF_H);
    }

    public void anotherMethod() {
        x++;
        y++;
        repaint(); // this will stimulate JVM to call paint/paintComponent
    }

    private void paintImage(Graphics g, BufferedImage img, int x, int y2) {
        g.drawImage(img, x, y2, this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintImage(g, image1, x, y);
    }


    private static void createAndShowGUI() {
        PaintEg paintEg = new PaintEg();

        JFrame frame = new JFrame("PaintEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(paintEg);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


我想你在寻找构造函数?编程是一种精确和严谨的练习,编译器是不可原谅的。在编写代码和在这里发布代码时,尤其是在大写和拼写方面,您将同样严格,因为草率的错误将杀死您的程序并使我们困惑。请检查一下这个。例如,它是公共的而不是公共的。对不起,我在我的kindle上发布了这篇文章,它有自动封顶功能。请进一步澄清你的问题。告诉我们你到底想做什么。我正在制作一个2d游戏库,这样当你在JPanel上绘制图像时,它就会在JPanel上绘制图像。我想你是在寻找构造器?编程是一个精确和严谨的练习,编译器是不可饶恕的。在编写代码和在这里发布代码时,尤其是在大写和拼写方面,您将同样严格,因为草率的错误将杀死您的程序并使我们困惑。请检查一下这个。例如,它是公共的而不是公共的。对不起,我在我的kindle上发布了这篇文章,它有自动封顶功能。请进一步澄清你的问题。告诉我们你到底想做什么。我正在制作一个2d游戏库,这样当你制作paintImage时,它会在JPanelTanks上绘制图像,但我不确定这是否可行,因为在第一个paintImage上,图像数据已经设置为非空,所以我认为它不会绘制第二个图像。你试过这个了吗?它对你有效吗?是的,它有效,因为每次重新绘制paintImage都会被称为作用域,如果你用不同的图像绘制paintImage两次,那么它只会绘制其中一个them@Ewen我已经更新了多图像显示的答案,还附上了一个输出。@HovercraftFullOfEels欢迎您,谢谢你的建议:谢谢,但我不太确定这是否可行,因为在第一张paintImage上,图像数据已经设置为非空,所以我认为它不会绘制第二张图像。你试过这个了吗?它对你有效吗?是的,它有效,因为每次重新绘制paintImage都会被称为作用域,如果你用不同的图像绘制paintImage两次,那么它只会绘制其中一个them@Ewen我已经更新了我对多图像显示的回答,并附上了一个输出。@HovercraftFullOfEels欢迎您,谢谢您的建议: