我实际上想要加载图片但只打开applet对话框并且没有发生错误但是图片没有加载。代码在这里
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ball extends JPanel{
Image image;
public Ball(){
super();
image = Toolkit.getDefaultToolkit().getImage("/D:\\lolololo\\tuto\\bin\\sa.jpg");
}
private Image getResource(String string) {
return image;
// TODO Auto-generated method stub
}
public void paintComponent(Graphics g){
// Draw our Image object.
g.drawImage(image,50,10,574,960, this); // at location 50,10
// 200 wide and high
}
public void main(String arg[]){
JFrame frame = new JFrame("ShowImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800,500);
Ball panel = new Ball();
frame.setContentPane(panel);
frame.setVisible(true);
}
}
答案 0 :(得分:1)
加载图片的方式是错误的。当您提取为Runnable jar时,这将永远不会起作用。
现在以这种方式加载图像
image = ImageIO.read(Ball.class.getResource("/res/sa.jpg"));
这样可行。
如安德鲁在评论中指出的主要课程应
public static void main(String arg[]) {}
答案 1 :(得分:1)
+1给@AndrewThompsons评论。
1)下面的内容不正确,你没有通过调用super.paintComponent(...)
的超级实现来表达油漆链:
public void paintComponent(Graphics g) {
// Draw our Image object.
g.drawImage(image,50,10,574,960, this); // at location 50,10
// 200 wide and high
}
As per docs for paintComponent:
此外,如果你没有调用super super的实现,你必须尊重 opaque属性,即如果此组件是不透明的,则必须 以非不透明的颜色完全填充背景。如果你不 尊重不透明属性,你可能会看到视觉文物。
应该是:
public class Ball extends JPanel {
BufferedImage image;
public Ball() {
super();
try {
image=ImageIO.read(new File("c:/test.jpg"));//change to your path of file
}catch(Exception ex) {//file did not load properly
ex.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
// Draw our Image object.
g.drawImage(image,0,0,image.getWidth(),image.getHeight(), this); // at location 50,10
// 200 wide and high
}
@Override
public Dimension getPreferredSize() {
return new Dimension(image.getWidth(),image.getHeight());//replace with size of image
}
}
另请注意:
我覆盖了getPreferredSize()
的{{1}}并返回了我想要的JPanel
(即图片大小),或者Dimension
只会与添加的组件一样大到它而不是图像(所以如果没有组件0,0)。
我还选择了JPanel
vs BufferedImage
并用try catch包围了该语句,以检查是否有任何错误被抛出。
我看到你也有Image
为什么50和10而不是0,0?
2)这也是(正如@AndrewThompson所说):
g.drawImage(image,50,10...)
仅当 / 位于您的类包中时才需要 / ,而不是当它位于您设置位置的硬盘上时。
3)正如@AndrewThompson所说,主要方法应该是:
image = Toolkit.getDefaultToolkit().getImage("/D:\\lolololo\\tuto\\bin\\sa.jpg");
请注意静态修改器应用其他方法只是另一种方法。
4)也不要使用public static void main(String[] args){}
,而是使用JFrame#setSize(..)
和/或覆盖LayoutManager
而不是简单地在getPreferredSize
实例上调用pack()
,然后再将其设置为可见