7179482: Component.accessibleContext and JComponent.accessibleContext refactoring
Reviewed-by: art, anthony, alexsch
--- a/jdk/src/share/classes/java/awt/Component.java Thu Jan 31 18:25:59 2013 +0400
+++ b/jdk/src/share/classes/java/awt/Component.java Thu Jan 31 18:51:17 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -8994,7 +8994,10 @@
* to the individual objects which extend Component.
*/
- AccessibleContext accessibleContext = null;
+ /**
+ * The {@code AccessibleContext} associated with this {@code Component}.
+ */
+ protected AccessibleContext accessibleContext = null;
/**
* Gets the <code>AccessibleContext</code> associated
@@ -9034,6 +9037,13 @@
protected AccessibleAWTComponent() {
}
+ /**
+ * Number of PropertyChangeListener objects registered. It's used
+ * to add/remove ComponentListener and FocusListener to track
+ * target Component's state.
+ */
+ private volatile transient int propertyListenersCount = 0;
+
protected ComponentListener accessibleAWTComponentHandler = null;
protected FocusListener accessibleAWTFocusHandler = null;
@@ -9098,10 +9108,12 @@
public void addPropertyChangeListener(PropertyChangeListener listener) {
if (accessibleAWTComponentHandler == null) {
accessibleAWTComponentHandler = new AccessibleAWTComponentHandler();
- Component.this.addComponentListener(accessibleAWTComponentHandler);
}
if (accessibleAWTFocusHandler == null) {
accessibleAWTFocusHandler = new AccessibleAWTFocusHandler();
+ }
+ if (propertyListenersCount++ == 0) {
+ Component.this.addComponentListener(accessibleAWTComponentHandler);
Component.this.addFocusListener(accessibleAWTFocusHandler);
}
super.addPropertyChangeListener(listener);
@@ -9115,13 +9127,9 @@
* @param listener The PropertyChangeListener to be removed
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
- if (accessibleAWTComponentHandler != null) {
+ if (--propertyListenersCount == 0) {
Component.this.removeComponentListener(accessibleAWTComponentHandler);
- accessibleAWTComponentHandler = null;
- }
- if (accessibleAWTFocusHandler != null) {
Component.this.removeFocusListener(accessibleAWTFocusHandler);
- accessibleAWTFocusHandler = null;
}
super.removePropertyChangeListener(listener);
}
--- a/jdk/src/share/classes/java/awt/Container.java Thu Jan 31 18:25:59 2013 +0400
+++ b/jdk/src/share/classes/java/awt/Container.java Thu Jan 31 18:51:17 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -3824,6 +3824,12 @@
return Container.this.getAccessibleAt(p);
}
+ /**
+ * Number of PropertyChangeListener objects registered. It's used
+ * to add/remove ContainerListener to track target Container's state.
+ */
+ private volatile transient int propertyListenersCount = 0;
+
protected ContainerListener accessibleContainerHandler = null;
/**
@@ -3859,11 +3865,27 @@
public void addPropertyChangeListener(PropertyChangeListener listener) {
if (accessibleContainerHandler == null) {
accessibleContainerHandler = new AccessibleContainerHandler();
+ }
+ if (propertyListenersCount++ == 0) {
Container.this.addContainerListener(accessibleContainerHandler);
}
super.addPropertyChangeListener(listener);
}
+ /**
+ * Remove a PropertyChangeListener from the listener list.
+ * This removes a PropertyChangeListener that was registered
+ * for all properties.
+ *
+ * @param listener the PropertyChangeListener to be removed
+ */
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ if (--propertyListenersCount == 0) {
+ Container.this.removeContainerListener(accessibleContainerHandler);
+ }
+ super.removePropertyChangeListener(listener);
+ }
+
} // inner class AccessibleAWTContainer
/**
--- a/jdk/src/share/classes/javax/swing/JComponent.java Thu Jan 31 18:25:59 2013 +0400
+++ b/jdk/src/share/classes/javax/swing/JComponent.java Thu Jan 31 18:51:17 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -3644,26 +3644,6 @@
}
/**
- * The <code>AccessibleContext</code> associated with this
- * <code>JComponent</code>.
- */
- protected AccessibleContext accessibleContext = null;
-
- /**
- * Returns the <code>AccessibleContext</code> associated with this
- * <code>JComponent</code>. The method implemented by this base
- * class returns null. Classes that extend <code>JComponent</code>
- * should implement this method to return the
- * <code>AccessibleContext</code> associated with the subclass.
- *
- * @return the <code>AccessibleContext</code> of this
- * <code>JComponent</code>
- */
- public AccessibleContext getAccessibleContext() {
- return accessibleContext;
- }
-
- /**
* Inner class of JComponent used to provide default support for
* accessibility. This class is not meant to be used directly by
* application developers, but is instead meant only to be
@@ -3689,7 +3669,18 @@
super();
}
- protected ContainerListener accessibleContainerHandler = null;
+ /**
+ * Number of PropertyChangeListener objects registered. It's used
+ * to add/remove ContainerListener and FocusListener to track
+ * target JComponent's state
+ */
+ private volatile transient int propertyListenersCount = 0;
+
+ /**
+ * This field duplicates the one in java.awt.Component.AccessibleAWTComponent,
+ * so it has been deprecated.
+ */
+ @Deprecated
protected FocusListener accessibleFocusHandler = null;
/**
@@ -3747,10 +3738,12 @@
public void addPropertyChangeListener(PropertyChangeListener listener) {
if (accessibleFocusHandler == null) {
accessibleFocusHandler = new AccessibleFocusHandler();
- JComponent.this.addFocusListener(accessibleFocusHandler);
}
if (accessibleContainerHandler == null) {
accessibleContainerHandler = new AccessibleContainerHandler();
+ }
+ if (propertyListenersCount++ == 0) {
+ JComponent.this.addFocusListener(accessibleFocusHandler);
JComponent.this.addContainerListener(accessibleContainerHandler);
}
super.addPropertyChangeListener(listener);
@@ -3764,9 +3757,9 @@
* @param listener the PropertyChangeListener to be removed
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
- if (accessibleFocusHandler != null) {
+ if (--propertyListenersCount == 0) {
JComponent.this.removeFocusListener(accessibleFocusHandler);
- accessibleFocusHandler = null;
+ JComponent.this.removeContainerListener(accessibleContainerHandler);
}
super.removePropertyChangeListener(listener);
}