Ignore:
Timestamp:
2021-01-04T17:06:18+01:00 (3 years ago)
Author:
GerdP
Message:

see #17184: Memory leaks

  • remove more listeners in destroy()
  • reset fields which might reference OSM objects
  • call data.clearSelection when data layer is destroyed so that fewer actions keep references on OSM elements in that layer

My goal here: When a layer is closed JOSM should really allow to GC all OSM data and GPX data that was loaded before.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

    r17418 r17440  
    175175    private final transient MainLayerManager layerManager;
    176176
     177    private PopupMenuHandler popupHandler;
     178
     179    private LayerListModelListener modelListener;
     180
    177181    /**
    178182     * registers (shortcut to toggle right hand side toggle dialogs)+(number keys) shortcuts
     
    212216        TableHelper.setFont(layerList, getClass());
    213217        layerList.setSelectionModel(selectionModel);
    214         layerList.addMouseListener(new PopupMenuHandler());
     218        popupHandler = new PopupMenuHandler();
     219        layerList.addMouseListener(popupHandler);
    215220        layerList.setBackground(UIManager.getColor("Button.background"));
    216221        layerList.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
     
    274279        model.populate();
    275280        model.setSelectedLayer(layerManager.getActiveLayer());
    276         model.addLayerListModelListener(
    277                 new LayerListModelListener() {
    278                     @Override
    279                     public void makeVisible(int row, Layer layer) {
    280                         layerList.scrollToVisible(row, 0);
    281                         layerList.repaint();
    282                     }
    283 
    284                     @Override
    285                     public void refresh() {
    286                         layerList.repaint();
    287                     }
    288                 }
    289                 );
     281        modelListener = new LayerListModelListener() {
     282            @Override
     283            public void makeVisible(int row, Layer layer) {
     284                layerList.scrollToVisible(row, 0);
     285                layerList.repaint();
     286            }
     287
     288            @Override
     289            public void refresh() {
     290                layerList.repaint();
     291            }
     292        };
     293
     294        model.addLayerListModelListener(modelListener);
    290295
    291296        // -- move up action
     
    398403        JumpToMarkerActions.unregisterActions();
    399404        layerList.setTransferHandler(null);
     405        layerList.removeMouseListener(popupHandler);
    400406        DISPLAY_NUMBERS.removeListener(visibilityWidthListener);
    401407        ExpertToggleAction.removeExpertModeChangeListener(visibilityWidthListener);
     
    403409        cycleLayerUpAction.destroy();
    404410        cycleLayerDownAction.destroy();
     411        model.removeLayerListModelListener(modelListener);
    405412        super.destroy();
    406413        instance = null;
Note: See TracChangeset for help on using the changeset viewer.