为什么程序没有进入loadImage()方法呢?
Why does the program not enter the loadImage() Method?
这个小程序的目标是加载一个.jpg图像并将其显示在由JPanel扩展的Canvas class中,显示在JFrame object中主要class,像这样:
Main-class
<code>
package imageloader;
import java.awt.Graphics;
import javax.swing.JFrame;
public class ImageLoader {
public static void main(String[] args)
{
JFrame frame = new JFrame();
Canvas c = new Canvas();
Graphics g = frame.getGraphics();
Loader load = new Loader();
frame.setSize(500, 500);
c.setImage(load.loadImage());
frame.add(c);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
</code>
<h1>The Canvas class</h1>
<code>
package imageloader;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Canvas extends JPanel
{
private BufferedImage img = null;
public Canvas()
{
this.setSize(500, 500);
this.setVisible(true);
}
@Override
public void paint(Graphics g)
{
g.drawLine(0, 0, 250, 250); // just to see if the Canvas is painting, and it does!
g.drawImage(img, 250, 250, null);
repaint();
}
public void setImage(BufferedImage img)
{
this.img = img;
}
}
</code>
<h1>The Loading class</h1>
<code>
package imageloader;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Loader
{
public BufferedImage loadImage()
{
BufferedImage im = null;
try
{
File f = new File("player.jpg");
im = ImageIO.read(f.getAbsoluteFile());
System.out.println("Loaded!"); // this did not apear in my Output-Console in Netbeans
}
catch (IOException e) {}
return im;
}
}
</code>
我的主要问题已经在标题中提出了。首先,我将代码与 Java 文档教程进行了比较,并将 Parent class 从 Canvas.java 更改为 Component,但收效甚微。参考这里:
然后我用 Google 找到了这个:
Displaying an image in Swing (on Whosebug)
因为我的 JFrame(或与此相关的组件)确实执行了从 (0|0) 到 (250|250) 的 drawLine() 函数,所以这不是问题所在,但我确实尝试了 paintcomponent()和paintComponents(),第一个画线不画图,速度比较慢,后者根本不画线,所以我又切换回paint()方法
在我的小研究之前,我自己尝试了不同的东西。我将装载机 class 从 Tutorial-Version.
改了一点
完整教程可在此处获取:Link
我同意 John3136,但直接回答:
如果您没有看到 "Loaded!",则表明 try 中的其他两行之一正在抛出异常。如果没有异常信息,很难进一步排除故障。
将 e.printStackTrace() 放在你的 catch 块中,post 如果你仍然遇到困难,请将结果放在这里。
尽管该文件可能与您的源位于同一目录中,但它必须与您的可执行文件位于同一目录中,您的代码才能找到它。检查 f.getAbsolutePath() 的值,看看它是否符合您的预期。
这个小程序的目标是加载一个.jpg图像并将其显示在由JPanel扩展的Canvas class中,显示在JFrame object中主要class,像这样:
Main-class
<code>
package imageloader;
import java.awt.Graphics;
import javax.swing.JFrame;
public class ImageLoader {
public static void main(String[] args)
{
JFrame frame = new JFrame();
Canvas c = new Canvas();
Graphics g = frame.getGraphics();
Loader load = new Loader();
frame.setSize(500, 500);
c.setImage(load.loadImage());
frame.add(c);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
</code>
<h1>The Canvas class</h1>
<code>
package imageloader;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Canvas extends JPanel
{
private BufferedImage img = null;
public Canvas()
{
this.setSize(500, 500);
this.setVisible(true);
}
@Override
public void paint(Graphics g)
{
g.drawLine(0, 0, 250, 250); // just to see if the Canvas is painting, and it does!
g.drawImage(img, 250, 250, null);
repaint();
}
public void setImage(BufferedImage img)
{
this.img = img;
}
}
</code>
<h1>The Loading class</h1>
<code>
package imageloader;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Loader
{
public BufferedImage loadImage()
{
BufferedImage im = null;
try
{
File f = new File("player.jpg");
im = ImageIO.read(f.getAbsoluteFile());
System.out.println("Loaded!"); // this did not apear in my Output-Console in Netbeans
}
catch (IOException e) {}
return im;
}
}
</code>
我的主要问题已经在标题中提出了。首先,我将代码与 Java 文档教程进行了比较,并将 Parent class 从 Canvas.java 更改为 Component,但收效甚微。参考这里:
然后我用 Google 找到了这个:
Displaying an image in Swing (on Whosebug)
因为我的 JFrame(或与此相关的组件)确实执行了从 (0|0) 到 (250|250) 的 drawLine() 函数,所以这不是问题所在,但我确实尝试了 paintcomponent()和paintComponents(),第一个画线不画图,速度比较慢,后者根本不画线,所以我又切换回paint()方法
在我的小研究之前,我自己尝试了不同的东西。我将装载机 class 从 Tutorial-Version.
改了一点完整教程可在此处获取:Link
我同意 John3136,但直接回答:
如果您没有看到 "Loaded!",则表明 try 中的其他两行之一正在抛出异常。如果没有异常信息,很难进一步排除故障。
将 e.printStackTrace() 放在你的 catch 块中,post 如果你仍然遇到困难,请将结果放在这里。
尽管该文件可能与您的源位于同一目录中,但它必须与您的可执行文件位于同一目录中,您的代码才能找到它。检查 f.getAbsolutePath() 的值,看看它是否符合您的预期。