图像未在JPanel.paintComponent中绘制

时间:2013-06-28 16:46:25

标签: java image swing

我实际上想要加载图片但只打开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);
  }
}

2 个答案:

答案 0 :(得分:1)

加载图片的方式是错误的。当您提取为Runnable jar时,这将永远不会起作用。

  • 在src
  • 内创建包(“res”)

现在以这种方式加载图像

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(),然后再将其设置为可见

5)另请阅读Concurrency in Swing。特别是Event-Dispatch-Thread