Java 未在JPanel.paintComponent中绘制图像

Java 未在JPanel.paintComponent中绘制图像,java,image,swing,jpanel,paintcomponent,Java,Image,Swing,Jpanel,Paintcomponent,我实际上想加载图像,但只有小程序对话框打开,没有发生错误,但图像没有加载。代码如下 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(

我实际上想加载图像,但只有小程序对话框打开,没有发生错误,但图像没有加载。代码如下

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);
  }
}

加载图像的方式是错误的。当您提取为可运行jar时,这将永远不起作用

  • 在src内创建包(“res”)
现在以这种方式加载图像

image = ImageIO.read(Ball.class.getResource("/res/sa.jpg"));
这会奏效的

正如Andrew在评论中指出的,主要类应该是

public static void main(String arg[]) {}

+1至@Andrewthompson评论

1) 下面是不正确的,您没有通过调用
super.paintComponent(…)
的super实现来优化绘制链:

:

此外,如果您不调用super的实现,则必须遵守 不透明属性,即如果此组件不透明,则必须 以非不透明的颜色完全填充背景。如果你不 尊重不透明属性,您可能会看到视觉瑕疵

应该是:

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
    }

}
另请注意:

  • 我覆盖了
    JPanel
    getPreferredSize()
    ,并返回了我想要的
    Dimension
    s(即图像大小),或者
    JPanel
    将只与添加到其中的组件一样大,而不是图像(因此如果没有组件0,0)

  • 我还选择了
    BufferedImage
    vs
    Image
    ,并用try-catch来检查是否抛出了任何错误

  • 我看到你也有
    g.drawImage(图像,50,10…
    为什么是50和10而不是0,0

2) 还有这一点(正如@AndrewThompson所说):

image=Toolkit.getDefaultToolkit().getImage(“/D:\\lolololo\\tuto\\bin\\sa.jpg”)

不需要/that仅当它位于您的类包中时,而不是当它位于您的硬盘上的设置位置时

3) 正如@AndrewThompson所说,主要方法应该是:

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
    }

}
publicstaticvoidmain(String[]args){}

请注意,静态修改器以另一种方式应用,它只是另一种方法

4) 也不要使用
JFrame#setSize(..)
,而是使用
LayoutManager
和/或覆盖
getPreferredSize
,而不是在
JFrame
实例上调用
pack()
,然后将其设置为可见

5) 另外,请仔细阅读。尤其是
“/D:\\lolololo\\tuto\\bin\\sa.jpg”
不应包含前导的
/
。它应该是
“D:\\lolololo\\tuto\\bin\\sa.jpg”
假定该路径的其余部分是正确的。作为一个无效的
public void main(字符串arg[]){
不是main方法的有效方法签名!给定
Toolkit.getImage(字符串)
在找不到图像时不会抛出任何错误,我更喜欢使用
ImageIO
加载它们。当出现任何错误时,它提供了许多有用的输出。另请参阅显示许多绘图图像示例的答案