Changeset 7469 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2014-08-30T14:14:46+02:00 (10 years ago)
Author:
Don-vip
Message:

fix #10444 - ConcurrentModificationException on key press

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/util/AdvancedKeyPressDetector.java

    r7293 r7469  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.util;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
    35
    46import java.awt.AWTEvent;
     
    1315import java.util.Set;
    1416import java.util.TreeSet;
     17
    1518import javax.swing.JFrame;
    1619import javax.swing.SwingUtilities;
     
    1922import org.openstreetmap.josm.Main;
    2023
    21 import static org.openstreetmap.josm.tools.I18n.tr;
    2224/**
    2325 * Helper object that allows cross-platform detection of key press and realease events
     
    3840
    3941    /**
    40      * Adds an object that wants to receive key press and release events
     42     * Adds an object that wants to receive key press and release events.
     43     * @param l listener to add
    4144     */
    42     public void addKeyListener(KeyPressReleaseListener l) {
     45    public synchronized void addKeyListener(KeyPressReleaseListener l) {
    4346        keyListeners.add(l);
    4447    }
    4548
    4649    /**
    47      * Adds an object that wants to receive key modifier changed events
     50     * Adds an object that wants to receive key modifier changed events.
     51     * @param l listener to add
    4852     */
    49     public void addModifierListener(ModifierListener l) {
     53    public synchronized void addModifierListener(ModifierListener l) {
    5054        modifierListeners.add(l);
    5155    }
    5256
    5357    /**
    54      * Removes the listener
     58     * Removes the listener.
     59     * @param l listener to remove
    5560     */
    56     public void removeKeyListener(KeyPressReleaseListener l) {
     61    public synchronized void removeKeyListener(KeyPressReleaseListener l) {
    5762        keyListeners.remove(l);
    5863    }
    5964
    6065    /**
    61      * Removes the key modifier listener
     66     * Removes the key modifier listener.
     67     * @param l listener to remove
    6268     */
    63     public void removeModifierListener(ModifierListener l) {
     69    public synchronized void removeModifierListener(ModifierListener l) {
    6470        modifierListeners.remove(l);
    6571    }
    66 
    6772
    6873    /**
     
    8085                timer.stop();
    8186                if (set.remove(releaseEvent.getKeyCode())) {
    82                     for (KeyPressReleaseListener q: keyListeners) {
    83                         q.doKeyReleased(releaseEvent);
     87                    synchronized (this) {
     88                        for (KeyPressReleaseListener q: keyListeners) {
     89                            q.doKeyReleased(releaseEvent);
     90                        }
    8491                    }
    8592                }
     
    93100     */
    94101    public void unregister() {
    95         timer.stop(); set.clear();
    96         if (!keyListeners.isEmpty()) {
    97             Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
    98         }
    99         if (!modifierListeners.isEmpty()) {
    100             Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
     102        timer.stop();
     103        set.clear();
     104        synchronized (this) {
     105            if (!keyListeners.isEmpty()) {
     106                Main.warn(tr("Some of the key listeners forgot to remove themselves: {0}"), keyListeners.toString());
     107            }
     108            if (!modifierListeners.isEmpty()) {
     109                Main.warn(tr("Some of the key modifier listeners forgot to remove themselves: {0}"), modifierListeners.toString());
     110            }
    101111        }
    102112        try {
     
    112122                timer.stop();
    113123            } else if (set.add((e.getKeyCode()))) {
    114                 for (KeyPressReleaseListener q: keyListeners) {
    115                     q.doKeyPressed(e);
     124                synchronized (this) {
     125                    for (KeyPressReleaseListener q: keyListeners) {
     126                        q.doKeyPressed(e);
     127                    }
    116128                }
    117129            }
     
    120132                timer.stop();
    121133                if (set.remove(e.getKeyCode())) {
    122                     for (KeyPressReleaseListener q: keyListeners) {
    123                         q.doKeyReleased(e);
     134                    synchronized (this) {
     135                        for (KeyPressReleaseListener q: keyListeners) {
     136                            q.doKeyReleased(e);
     137                        }
    124138                    }
    125139                }
     
    142156        if (previousModifiers != modif) {
    143157            previousModifiers = modif;
    144             for (ModifierListener m: modifierListeners) {
    145                 m.modifiersChanged(modif);
     158            synchronized (this) {
     159                for (ModifierListener m: modifierListeners) {
     160                    m.modifiersChanged(modif);
     161                }
    146162            }
    147163        }
Note: See TracChangeset for help on using the changeset viewer.