我正在制作Java游戏。我有一个扩展JPanel的Board类,并使用jim
将一个节点paintComponent(Graphics g) {
(它是Ball类的对象实例)绘制到屏幕上。我可以使用箭头键在JPanel上移动Ball对象。
我希望加载一个图像,而不是将Ball对象表示为红色方块。
Board class扩展了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,我无法将标签添加到对象中。
答案 0 :(得分:2)
请勿将字符串与==
进行比较,请使用equals
if (imgType == "jim") ==>> if ("jim".eqauls(imgType))
您应该从URL而不是File对象中读取。可以使用getClass().getResource()
获取网址。 e.g。
jimImg = ImageIO.read(
Ball.class.getResource("/resources/Jim.png"));
您应该在构造函数中使用try/catch
,因此您不必在以后实例化Ball
JPanel
上绘画并覆盖其paintCompoent
或JComponet
您实际上从未使用从构造函数中获取的变量来绘制`
g.drawImage(jimImg, x, y, w, h, this);
使用绘画时,您应该覆盖getPreferredSize
的{{1}},以便框架相应地调整大小。
这是一个有效的运行示例。请记住我的文件结构如
JPanel
ProjectRoot/src/resources/image.png
“我的类的结构方式:主类添加JFrame,我在其中添加一个新的Board类对象到JFrame(Board类扩展JPanel)。然后我有Board类扩展JPanel,它添加了一个新的Ball对象并且有键盘方法等...所以我可以移动Ball。然后Ball Class只是一个带有get / set方法getX(),setX()等的节点。所以我无法在没有扩展的情况下向Ball类添加图像JPanel的?“
看起来你根本不需要球作为组件。而不是让球成为一个组成部分,只需使它成为常规课程。在你的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 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);
}
});
}
}