rednight

          0x2B|~0x2B,That's not a question,Just do it.
          posts - 32, comments - 14, trackbacks - 0, articles - 0

          Memory Leak for ListCellRenderer

          Posted on 2007-01-16 09:04 rednight 閱讀(435) 評論(0)  編輯  收藏

          We have known, the ListCellRenderer interface has only one method public Component getListCellRendererComponent(), and it returns a Component. When a JList needs to compute its dimension or paint its cell item, this method will be called. So it will be called frequently, and we have a best practice, try to reuse object, avoid time-consumed computation and unnecessary operation in this method.

          ?

          Recently found, there is a memory leak bug for list cell renderer in both JDK 1.4.x and JDK 5 (don’t know whether has the same bug in earlier JDK). The component returned from getListCellRendererComponent() method could not be GC, and all its referenced objects also could not be GC. Unfortunately, this bug is only fixed in JDK 6.

          ?

          So currently, if a JList use the ListCellRenderer, but only holds a little resource (eg: the JList only has little items, and the component is returned from ListCellRenderer is a simple JLable), you may not care about the memory leak.

          ?

          But if a JList use the ListCellRenderer, and holds a large resource, you should remember to use the following way to avoid memory leak.

          ?

          Work Around: Subclass JList and invoke removeAll after painting is done:

          ?????? public class xxxList extends JList {

          ??????????? private CellRendererPane renderer;

          ??????????? private CellRendererPane getRenderer() {

          ??????????????? if (renderer == null) {

          ??????????????????? for (int i=0; i<getComponents().length; i++) {

          ????????????????????????????????????????? Component c? = getComponents()[i];

          ??????????????????????? if (c instanceof CellRendererPane) {

          ??????????????????????????? renderer = (CellRendererPane)c;

          ??????????????????????????? break;

          ??????????????????????? }

          ??????????????????? }

          ??????????????? }

          ??????????????? return renderer;

          ??????????? }

          ??????????? protected void paintComponent(Graphics g) {

          ??????????????? super.paintComponent(g);

          ??????????????? CellRendererPane renderer = getRenderer();

          ??????????????? if (renderer != null) {

          ??????????????????? renderer.removeAll();

          ??????????????? }

          ??????????? }

          ??????? }


          Please refer to http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5044798 for more details.

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 湛江市| 长白| 鹿泉市| 元江| 岳普湖县| 北宁市| 平原县| 华容县| 永仁县| 靖江市| 淮南市| 南丰县| 丰镇市| 林口县| 虎林市| 平罗县| 平果县| 砀山县| 泽库县| 青岛市| 察雅县| 夹江县| 嵊州市| 韩城市| 同江市| 安多县| 黄骅市| 菏泽市| 奉节县| 台湾省| 安福县| 田阳县| 三原县| 图木舒克市| 新余市| 思南县| 随州市| 确山县| 中牟县| 新昌县| 河北省|