0

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

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

2 回答 2

1

+1 @AndrewThompsons 评论。

1) 下面是不正确的,您不会通过调用 supers 的实现来磨练绘制链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

}

根据 paintComponent 的文档

此外,如果你不调用 super 的实现,你必须遵守 opaque 属性,也就是说,如果这个组件是不透明的,你必须用不透明的颜色完全填充背景。如果您不尊重 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()的s(即图像大小),或者它只会与添加到它的组件一样大,而不是图像(所以如果没有组件 0,0)。JPanelDimensionJPanel

  • 我还选择了BufferedImagevsImage并用 try catch 包围了该语句,以检查是否抛出任何错误。

  • 我看到你也有g.drawImage(image,50,10...)为什么 50 和 10 而不是 0,0?

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

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

仅当它位于您的类包中时才需要/ ,而不是当它在您的硬盘驱动器上的固定位置时。

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

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

请注意,静态修饰符应用了其他方式,它只是另一种方法。

4)也不要使用JFrame#setSize(..),而是使用LayoutManager和/或覆盖,而不是在设置可见之前getPreferredSize简单地调用实例。pack()JFrame

5) 另外请阅读Swing 中的并发。尤其是事件调度线程

于 2013-06-28T17:42:30.867 回答
1

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

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

现在以这种方式加载图像

image = ImageIO.read(Ball.class.getResource("/res/sa.jpg"));

这将起作用。

正如安德鲁在他的评论中指出的那样,主要课程应该是

public static void main(String arg[]) {}
于 2013-06-28T17:33:59.233 回答