有一个Panel里面是动态计算出的图片,其大小是会发生变化的。
在屏幕分辨率为800X600下,由于这个Panel太大,导致图片不能完全显示,需要增加一个滚动条,才可以看到。
静态读入的图片可以增加滚动条,但是如何给"大小动态变化的图片"设置滚动条?

解决方案 »

  1.   

    你所需要做的仅仅是把这个panel放到一个JScrollPane上,然后根据图片的大小动态的调整panel的大小就行,调整完后,记得调用一下JScrollPane.UpdateUI();
      

  2.   

    用javax.swing.JScrollPane放这个图片.该pane自带滚动条
      

  3.   

    ZRBRZB:我的图片是直接画在Panel上面的,放在一个JScrollPane上,是不起作用的。
    Ark032425: 我的图片是画在Panel上面的,这个不能改,所以只能将Panel放在JScrollPane中。
      

  4.   

    建议将动态的图片转换为文件,并更新JScrollPane。
    另外,也可以根据图片的大小,动态的设置Panel的绝对大小。
      

  5.   

    使用JScrollBar,而非JScrollPane虽然Swing滚动模型对大多数滚动应用是足够了,但是,为了显示有大量数据的视图,由于性能和资源的原因,可能这种视口/视图模型不能工作。在这种情况下,最好反转滚动模型,即提供一个固定大小的视图,当与之相关的滚动条被操纵时,就重新绘制这个视图。
    可以把许多策略应用到反转的滚动模型中,以便进一步增强性能。例如,缓存下一次和前一次的信息块、把图形从屏外缓存拷贝到视图的屏上代表中。
      

  6.   

    sgcl: 将动态的图片转换为文件,这个倒是想过,必须把图片不保存出去,然后又读进来,显示在Panel里面,操作太过麻烦,而且性能不好。
         根据图片的大小,动态的设置Panel的绝对大小,具体怎末实现?
    susuifeng: 跟你说的情况不是完全一样,因为整个图片是画在Panel上面的,每一次点击“draw”按钮,都会画出新的图片,但是给这个panel加滚动条不起作用。
      

  7.   

    需要给你的imPane 设置preferredSize。
    例如:
    你的图片是2000*2000的大小,那么给你的imPane 调用setPreferredSize(new Dimension(2000,2000));
    至于你的scrollpane到底多少这是你设置的,假设是800*600.实际的clipRect可能是798*598。那么这个范围是你的可见范围。实际swing是通过内部的preferredSize和clipBounds的比例和位置来调整滚动条的。下班了。如有疑问,节后再见。你一试便知。建议读一下jpanel和jscrollpane的源码。多数的书上都没有谈及这个问题。
      

  8.   

    这样可以增加滚动条,但是imPane的大小要固定,不是很灵活。
    当拖动滚动条的时候,panel上面的图像会花掉。
      

  9.   

    没看明白你说的。
    第一,大小是在更换图片的时候动态更改的。不是一开始设定了以后就不变的。你的panel不需要固定大小。
    第二,图像会花掉,我没有发现你的问题。请确认你的控制方式。你最好那代码出来看。莪米个人的代码都是不一样的。只是这样说,没有办法判断你的问题。
      

  10.   

    1、我的图像是直接动态画在panel上面的,因此面板是是随着图像的大小发生变化的。
    2、 mainPanel 是画图像的面板
        mainPanel.setPreferredSize(new Dimension(730, 730));
        JScrollPane scrollPanel = new JScrollPane(mainPanel);
    3、当移动滚动条的时候,图像会被拉升,可能是需要刷新,需不需要事件支持?
      

  11.   

    这个简单,我已经实现了,我是用 JScrollPane
    的,具体方法:
    int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
    int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
    jsp = new JScrollPane(painter, v, h);
    painter变量中,主要要重写下面的方法
    paintComponent(Graphics g){

    Dimension size = new Dimension(upSqre, upSqre);
    setSize(size);
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    }
    也就是说,你每次动态获取图片的时候,需要把图片的width,height 得到,然后传给 new Dimension(upSqre, upSqre);
    是不是有滚动条,主要看setPreferredSize(size);
    这个函数的
    希望对你有绝对的帮助,因为我已经实现了
      

  12.   

    我获取的因该是画图片的整个Panel的大小,不是图片的大小,所以你的方法还是不行!
      

  13.   

    我的图片是画在一个Panel上面的,所以需要给这个panel加上滚动条。
      

  14.   

    需要给你的imPane 设置preferredSize。
    例如:
    你的图片是2000*2000的大小,那么给你的imPane 调用setPreferredSize(new Dimension(2000,2000));
    至于你的scrollpane到底多少这是你设置的,假设是800*600.实际的clipRect可能是798*598。那么这个范围是你的可见范围。实际swing是通过内部的preferredSize和clipBounds的比例和位置来调整滚动条的。下班了。如有疑问,节后再见。你一试便知。用 JScrollPane建议读一下jpanel和jscrollpane的源码。多数的书上都没有谈及这个问题。
      

  15.   

    我也遇到过楼主这样的问题,不过是把东西花在JLabel上的,然后再add进JScrollPane里。
    实现的方法跟楼上的liujun3512159差不多,也是事先获得要绘制图形的大小,然后再设置JLabel的大小
      

  16.   

    当然了,JLable肯定是可以的,因为滚动条是随着JLable发生变化的,但是现在图片是画在jpanel上面的。
      

  17.   

    To liujun3512159 :把你的相关代码贴出来看看!