| | 948 | |
| | 949 | /** |
| | 950 | * This is a listener that gets informed whenever repaint is called for this MapView. |
| | 951 | * <p> |
| | 952 | * This is the only safe method to find changes to the map view, since many components call MapView.repaint() directly. |
| | 953 | * @author Michael Zangl |
| | 954 | */ |
| | 955 | public interface RepaintListener { |
| | 956 | /** |
| | 957 | * Called when any repaint method is called (using default arguments if required). |
| | 958 | * @param tm see {@link JComponent#repaint(long, int, int, int, int)} |
| | 959 | * @param x see {@link JComponent#repaint(long, int, int, int, int)} |
| | 960 | * @param y see {@link JComponent#repaint(long, int, int, int, int)} |
| | 961 | * @param width see {@link JComponent#repaint(long, int, int, int, int)} |
| | 962 | * @param height see {@link JComponent#repaint(long, int, int, int, int)} |
| | 963 | */ |
| | 964 | void repaint(long tm, int x, int y, int width, int height); |
| | 965 | } |
| | 966 | |
| | 967 | private final CopyOnWriteArrayList<RepaintListener> repaintListeners = new CopyOnWriteArrayList<>(); |
| | 968 | |
| | 969 | /** |
| | 970 | * Adds a listener that gets informed whenever repaint() is called for this class. |
| | 971 | * @param l The listener. |
| | 972 | */ |
| | 973 | public void addRepaintListener(RepaintListener l) { |
| | 974 | repaintListeners.add(l); |
| | 975 | } |
| | 976 | |
| | 977 | /** |
| | 978 | * Removes a registered repaint listener. |
| | 979 | * @param l The listener. |
| | 980 | */ |
| | 981 | public void removeRepaintListener(RepaintListener l) { |
| | 982 | repaintListeners.remove(l); |
| | 983 | } |
| | 984 | |
| | 985 | @Override |
| | 986 | public void repaint(long tm, int x, int y, int width, int height) { |
| | 987 | // This is the main repaint method, all other methods are convenience methods and simply call this method. This is just an observation, not a must, but seems to be true for all implementations I found so far. |
| | 988 | if (repaintListeners != null) { |
| | 989 | // Might get called early in super constructor |
| | 990 | for (RepaintListener l : repaintListeners) { |
| | 991 | l.repaint(tm, x, y, width, height); |
| | 992 | } |
| | 993 | } |
| | 994 | super.repaint(tm, x, y, width, height); |
| | 995 | } |