Java code
class Animater extends JPanel {
    Animater() {
    
                }    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ImageIcon img = new ImageIcon("map2.jpg");
        this.setSize(img.getIconWidth(), img.getIconHeight());
        System.out.println(img.getIconHeight());
        img.paintIcon(this, g, 0, 0);
    }
}public class mainframe extends JFrame {
    public mainframe() {
        super("地图");
        getContentPane().setLayout(null);
        Animater am= new Animater();
        Container c= this.getContentPane();
         JScrollPane scrollPane = new JScrollPane(am);
         scrollPane.setAutoscrolls(true);
         scrollPane.setBounds(0, 0, 1016, 596);
         scrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
         scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        c.add(scrollPane);
        this.setSize(1024,734);
        this.setVisible(true);
        
        
        
        
    }
}
public class main {
    public static void main(String[] args) {
        mainframe mf= new mainframe();    }}我的3个类,第一个是继承的JPanel 为了放图片进去 
有几个问题 
第一个问题比较奇怪 我的Animater类里 写了一个System.out.println(xxxx);语句.我现在运行起来,他不断的打印出数据,并且cpu使用率一直是100%.这是为什么?怎么解决。..? 
第二个问题..我如果将我的那张map.jpg替换成另外一张分辨率很高的,文件大小很大的图,运行起来就直接抱错 
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space  请问下为什么?有办法解决吗? 
第三个问题..我是在jpanel里装进了图片,再将jpanel放到jscrollpanel里的,目的是想可以用滚轴来上下拖动图片,因为图片可能比较大,但为什么我现在不管图片多大 滚轴都没效果....这个问题比较重要..  
谢谢各位了 

解决方案 »

  1.   

    1.paintComponent会被JVM反复调用来重画界面,因为操作系统的界面会被时刻重画的。所以不要写打印语句。
    2.因为你在反复执行的函数中反复加载图片,所以浪费空间。所以就内存溢出了。
    3.应该将图片组件直接加入到jpanel中就可以看到结果了。这个没成,我觉得你写的程序本来像封装一个加载图片的组件,但是这个组件你没有封装好导致的问题。
      

  2.   

    楼上解释很正确。第二点我补充一下,默认的jvm使用32M内存的,这个对一些程序来说可能太小了,可以加上-Xmx512m 指定jvm最大使用512m的内存
      

  3.   


    我修改了jvm的内存 大图片可以正常显示了
    但第1个问题还是没有解决,我去掉了super.paintComponent(g);  我运行起来,它依旧一直不停的打印数据出来...为什么呢
      

  4.   

     this.setSize(img.getIconWidth(), img.getIconHeight()); 
    导致你的面板重新绘制 和super没关系