[英]Add image to node that is being painted onto JPanel class
我正在制作Java游戏。 我有一个扩展JPanel的Board类,并使用paintComponent(Graphics g) {
在屏幕上绘制了一个节点jim
,它是Ball类的对象实例。 我可以使用箭头键在JPanel上移动Ball对象。
我不想将Ball对象表示为红色正方形,而是要加载图像。
Board类扩展了JPanel:
jim = new Ball(0, 0, 50, 50, "jim");
球类:
public class Ball extends Component {
int x, y, w, h;
BufferedImage jimImg;
public Ball(int xLoc, int yLoc, int width, int height, String imgtype) throws IOException {
x = xLoc;
y = yLoc;
w = width;
h = height;
jimImg = ImageIO.read(new File("resources/Jim.png"));
loadImages(imgtype);
}
public void paint(Graphics g) {
g.drawImage(jimImg, 200, 0, null);
}
它没有画在红色方块上,甚至根本没有出现。
我还尝试过将图像作为JLabel追加... Ball类中的以下代码:
public void loadImages(String imgType) throws IOException {
if (imgType == "jim") {
JLabel utc = new JLabel("test");
ImageIcon utcImg = new ImageIcon("resources/Miller.png");
utc.setIcon(utcImg);
}
}
但是由于Ball
类不是JPanel,所以无法将标签添加到对象。
不要将字符串与==
进行比较,请使用equals
if (imgType == "jim") ==>> if ("jim".eqauls(imgType))
您应该从URL而不是File对象读取。 可以使用getClass().getResource()
获得URL。 例如
jimImg = ImageIO.read( Ball.class.getResource("/resources/Jim.png"));
您应该在构造函数中使用try/catch
,这样以后在实例化Ball
时就不必再使用了。
JPanel
上绘画并覆盖其paintCompoent
或JComponet
您从不真正使用构造函数中的变量来绘制`
g.drawImage(jimImg, x, y, w, h, this);
使用绘画时,您应该覆盖JPanel
的getPreferredSize
,以便框架相应地调整其大小。
这是一个有效的示例。 请记住,我的文件结构看起来像
ProjectRoot/src/resources/image.png
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Ball extends JPanel {
int x, y, w, h;
BufferedImage jimImg;
public Ball(int xLoc, int yLoc, int width, int height) {
x = xLoc;
y = yLoc;
w = width;
h = height;
try {
jimImg = ImageIO.read(
Ball.class.getResource("/resources/stackoverflow5.png"));
System.out.println(jimImg);
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(jimImg, x, y, w, h, this);
}
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new Ball(50, 50, 100, 100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}
“类的结构方式:主类添加了JFrame,在其中向JFrame添加了新的Board类对象(Board类扩展了JPanel)。然后,Board类扩展了JPanel,后者添加了新的Ball对象并具有键盘方法,等等...所以我可以移动Ball。然后Ball类只是一个具有get / set方法getX(),setX()等的节点。因此,如果不扩展JPanel,就无法向Ball类添加图像吗?”
看起来根本不需要球成为组件。 与其使球成为一个组件,不如使它成为普通班。 在Board JPanel的paintComponent中,只需为每个球调用ball.paint()即可。
import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class Board extends JPanel { Ball ball = new Ball(50, 50, 200, 200); @Override public void paintComponent(Graphics g) { super.paintComponent(g); ball.drawBall(g); } public Dimension getPreferredSize() { return new Dimension(400, 400); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame(); frame.add(new Board()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }); } } class Ball { int x, y, w, h; BufferedImage jimImg; public Ball(int xLoc, int yLoc, int width, int height) { x = xLoc; y = yLoc; w = width; h = height; try { jimImg = ImageIO.read( Board.class.getResource("/resources/stackoverflow5.png")); System.out.println(jimImg); } catch (IOException ex) { ex.printStackTrace(); } } public void drawBall(Graphics g) { g.drawImage(jimImg, x, y, w, h, null); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.