Java-使用方法和构造函数绘制图形
我正在开发一个java 2d游戏库。每次调用paintImage时,我都需要一个名为paintImage的方法来执行graphics.drawImageJava-使用方法和构造函数绘制图形,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
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欢迎您,谢谢您的建议: