Java 将图像添加到正在绘制到JPanel类上的节点
我正在做一个Java游戏。我有一个扩展JPanel的Board类,并使用Java 将图像添加到正在绘制到JPanel类上的节点,java,swing,jpanel,Java,Swing,Jpanel,我正在做一个Java游戏。我有一个扩展JPanel的Board类,并使用paintComponent(Graphics g){在屏幕上绘制了一个节点jim,这是Ball类的对象实例。我可以使用箭头键在JPanel上移动Ball对象 我希望加载一个图像,而不是将球对象表示为红色正方形 Board类扩展了JPanel: jim=新球(0,0,50,50,“jim”); 球类: public class Ball extends Component { int x, y, w, h;
paintComponent(Graphics g){
在屏幕上绘制了一个节点jim
,这是Ball类的对象实例。我可以使用箭头键在JPanel上移动Ball对象
我希望加载一个图像,而不是将球对象表示为红色正方形
Board类扩展了JPanel:
jim=新球(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);
}
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);
}
}
不过,它并没有在红场的顶部绘制,甚至根本没有出现
我还尝试将图像附加为JLabel…以下是Ball类中的代码:
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);
}
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))
getClass().getResource()
获取URL
jimImg = ImageIO.read(
Ball.class.getResource("/resources/Jim.png"));
try/catch
,这样以后在实例化Ball
JPanel
上绘制,并覆盖其paintcomponent
或JComponet
g.drawImage(jimImg, x, y, w, h, this);
JPanel
的getPreferredSize
,以便框架将相应地调整大小下面是一个运行中的示例,请记住我的文件结构
ProjectRoot/src/resources/image.png
根据操作指令进行编辑
“我的类的结构方式:Main类添加JFrame,我在JFrame中添加了一个新的Board类对象(Board类扩展了JPanel)。然后我有Board类扩展了JPanel,它添加了一个新的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);
}
}
我的类的结构方式:Main类添加JFrame,我在JFrame中添加了一个新的Board类对象(Board类扩展了JPanel)。然后我有Board类扩展了JPanel,它添加了一个新的Ball对象,并有键盘方法等等。这样我就可以移动球。然后Ball类只是一个带有get/set方法
getX(),setX()的节点
等等。所以我不能在不扩展JPanel的情况下向Ball类添加图像?所有这些想法都可以考虑,以实现您所需要的。这只是一个基于上述代码的示例。看起来您根本不需要将Ball作为组件。与其将Ball作为组件,不如将其作为常规类。一个d在你的Board JPanel
的paintComponent
中,只要为你看到我编辑的每个球调用ball.paint()
。我用一个ball
类编辑它,这个类不是Component
,并使用Board
类进行绘制。好的,我是我的Board类,我做了jim.paint(g);
(jim是Ball对象的名称,上面的红色块),在Ball类中,我做了Image jimImg=ImageIO.read(新文件(“resources/UTC.png”);
,然后public void paint(Graphics g){g.drawImage(jimImg,0,0,null);}
(与上面使用ImageIO.read
try/catch的方式一样,它在线程“main”中抛出了异常)java.lang.IllegalArgumentException:input==null!
error)