Java 向JFrames添加图像时出现的问题
我一直在尝试将图像图标加载到jframe中。我不知道为什么这个代码不起作用。我尝试过使用jpanels和jlabels,以及其他加载图像的方法,但这些方法都不起作用。我认为正因为如此,它与我设置的JFrame有关。我想远离jpanels和jlabels,因为至少就我所知,它们是无法伸缩的。如果有人有办法添加图片,请告诉我。代码如下:Java 向JFrames添加图像时出现的问题,java,image,swing,embedded-resource,imageicon,Java,Image,Swing,Embedded Resource,Imageicon,我一直在尝试将图像图标加载到jframe中。我不知道为什么这个代码不起作用。我尝试过使用jpanels和jlabels,以及其他加载图像的方法,但这些方法都不起作用。我认为正因为如此,它与我设置的JFrame有关。我想远离jpanels和jlabels,因为至少就我所知,它们是无法伸缩的。如果有人有办法添加图片,请告诉我。代码如下: import java.awt.Canvas; import javax.swing.JFrame; import java.awt.*; import javax
import java.awt.Canvas;
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.ImageIcon;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
public class Base extends Canvas implements Runnable {
private static final long serialVersionUID = 001;
private Image rock1;
private Image rock2;
private Image wood1;
private Thread thread;
private boolean running = (false);
private boolean paused = (false);
int x = 0;
int y = 0;
int z = 512;
private void start() {
if (running)
return;
running = true;
thread = new Thread(this);
}
public void run(){}
public Base(){}
public static void main(String[] Args) {
Base game = new Base();
JFrame frame = new JFrame();
frame.add(game);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
frame.setTitle("Game");
System.out.println("Running...");
game.start();
game.loadPics();
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_A) {
x = x - 5;
}
if (e.getKeyCode() == KeyEvent.VK_D) {
x = x + 5;
}
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
y = y - 5;
}
if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
y = y + 5;
}
if (e.getKeyCode() == KeyEvent.VK_W) {
z = z + 5;
}
if (e.getKeyCode() == KeyEvent.VK_S) {
z = z - 5;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
paused = (true);
}
}
public void loadPics(){
rock1 = new ImageIcon("C\\...\\rock1.png").getImage();
rock2 = new ImageIcon("C\\...\\rock2.png").getImage();
wood1 = new ImageIcon("C\\....\\wood1.png").getImage();
repaint();
}
public void paint(Graphics g){
while(paused = false){
g.drawImage(rock1, x, y, z, z, this);
g.drawImage(rock2, x + 512, y, z, z, this);
g.drawImage(wood1, x, y + 512, z, z, this);
try{
Thread.sleep(16);
}catch(Exception e){}
g.dispose();
}
}
}
同样,我认为问题在于我的JFrame,但我不能太确定,因为我不是最有经验的java程序员。无论如何,如果您知道解决方案或需要更改的内容,请提供帮助。此声明
while (paused = false){
在使用赋值表达式时,将始终计算为false
,因此不会发生对drawImage
的后续调用。您可能打算使用=
运算符来比较原语布尔值:
while (paused == false){
- 不要使用
paint
,使用子类JComponent
- 不要在任何
paint
方法中调用Thread.sleep
。Swing有自己的功能。您可以使用来定期执行图形更新,而不是在此处调用Thread.sleep
除此之外,AWT是重量级组件,不能与轻量级Swing组件一起很好地渲染。对Swing应用程序使用而不是键侦听器。此语句
while (paused = false){
在使用赋值表达式时,将始终计算为false
,因此不会发生对drawImage
的后续调用。您可能打算使用=
运算符来比较原语布尔值:
while (paused == false){
- 不要使用
paint
,使用子类JComponent
- 不要在任何
paint
方法中调用Thread.sleep
。Swing有自己的功能。您可以使用来定期执行图形更新,而不是在此处调用Thread.sleep
除此之外,AWT是重量级组件,不能与轻量级Swing组件一起很好地渲染。对Swing应用程序使用而不是关键侦听器。我遇到过很多类似的问题,并且已经开发出了一种解决方法。
首先,您的公共类基类
需要双缓冲。将方法绘制(图形g)
更改为绘制组件(图形g)
。添加新的绘制(图形g)
方法并添加此代码:
public void paint(Graphics g) {
// TODO Auto-generated method stub (IGNORE!!!)
dbi = createImage (getWidth(),getHeight());
dbg = dbi.getGraphics();
paintComponent(dbg);
g.drawImage(dbi , 0 , 0 , this);
}
并在公共类基的顶部添加以下变量:
private Image dbi;
private Graphics dbg;
这将自动调用paintComponent(Graphics g)
,并已完成第一步
接下来,删除paintComponent()
中的try语句,并将其写入run()
@Override
注释必须存在,否则它将不会重新绘制
下一部分是关键:
在其他任何事情之前,先放置super.paint(g)代码>位于油漆组件(图形g)
和repaint()代码>在底部
这本应该解决它,但我发现了一些潜在的问题
- JFrame初始化
public Base(){
add(game);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setTitle("Game");
start();
loadPics();
}
public static void main(String[] Args) { // Makes game smoother
Base base = new Base ();
Thread t = new Thread (base);
t.start();
}
- 删除
private void start()
,因为这不会影响游戏
- 检查文件目录,因为它们可能不正确提示:C\不会剪切它。是C:\
希望它的工作和快乐的编码 我遇到过很多类似的反复出现的问题,并且已经找到了解决这个问题的方法。
首先,您的公共类基类
需要双缓冲。将方法绘制(图形g)
更改为绘制组件(图形g)
。添加新的绘制(图形g)
方法并添加此代码:
public void paint(Graphics g) {
// TODO Auto-generated method stub (IGNORE!!!)
dbi = createImage (getWidth(),getHeight());
dbg = dbi.getGraphics();
paintComponent(dbg);
g.drawImage(dbi , 0 , 0 , this);
}
并在公共类基的顶部添加以下变量:
private Image dbi;
private Graphics dbg;
这将自动调用paintComponent(Graphics g)
,并已完成第一步
接下来,删除paintComponent()
中的try语句,并将其写入run()
@Override
注释必须存在,否则它将不会重新绘制
下一部分是关键:
在其他任何事情之前,先放置super.paint(g)代码>位于油漆组件(图形g)
和repaint()代码>在底部
这本应该解决它,但我发现了一些潜在的问题
- JFrame初始化
public Base(){
add(game);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setTitle("Game");
start();
loadPics();
}
public static void main(String[] Args) { // Makes game smoother
Base base = new Base ();
Thread t = new Thread (base);
t.start();
}
- 删除
private void start()
,因为这不会影响游戏
- 检查文件目录,因为它们可能不正确提示:C\不会剪切它。是C:\
希望它的工作和快乐的编码 1)“C\\…\\rock1.png”
这就是代码中的字面意思吗?尝试执行File f=new文件(“C\\…\\rock1.png”);System.out.println(“存在?”+文件.Exists())代码>。这些资源通常应该通过URL而不是文件加载。大约每12个小时讨论一次。2) 使用所有回转组件。3) 使用javax.swing.Timer
调用repaint()
而不是线程
和睡眠(n)
。4) 除非你自己创建了一个图形
实例,否则不要处理它。1)“C\\…\\rock1.png”
这就是代码中的内容吗?尝试执行File f=new文件(“C\\…\\rock1.png”);System.out.println(“存在?”+文件.Exists())代码>。这些资源通常应该通过URL而不是文件加载。大约每12个小时讨论一次。2) 使用所有回转组件。3) 使用javax.swing.Timer
调用repaint()
而不是线程
和睡眠(n)
。4) 除非您创建了图形
实例,否则不要处理该实例