The attached patch fixes an issue with the JLayeredPane.setPosition().
This method was not working correctly and in some cases threw exceptions
when it should not. I rewrote this method and now it should work
correctly.
I also removed a method in Container that was not specified and only used
from the JLayeredPane.setPosition() method. I reimplemented this method
as a helper method in JLayeredPane.
2006-01-27 Roman Kennke <[EMAIL PROTECTED]>
* java/awt/Container.java
(swapComponents): Removed unspecified method.
* javax/swing/JLayeredPane.java
(setPosition): Reimplemented correctly.
(swapComponents): New helper method.
/Roman
Index: javax/swing/JLayeredPane.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/JLayeredPane.java,v
retrieving revision 1.36
diff -u -r1.36 JLayeredPane.java
--- javax/swing/JLayeredPane.java 27 Jan 2006 12:37:59 -0000 1.36
+++ javax/swing/JLayeredPane.java 27 Jan 2006 15:46:58 -0000
@@ -411,39 +411,16 @@
*/
public void setPosition(Component c, int position)
{
- int layer = getLayer (c);
- int[] range = layerToRange(new Integer(layer));
- if (range[0] == range[1])
- throw new IllegalArgumentException ();
-
- int top = range[0];
- int bot = range[1];
- if (position == -1)
- position = (bot - top) - 1;
- int targ = Math.min(top + position, bot-1);
- int curr = -1;
-
- Component[] comps = getComponents();
- for (int i = top; i < bot; ++i)
- {
- if (comps[i] == c)
- {
- curr = i;
- break;
- }
- }
- if (curr == -1)
- // should have found it
- throw new IllegalArgumentException();
+ int currentPos = getPosition(c);
+ if (currentPos == position)
+ return;
- if (curr == 0)
- super.swapComponents(curr, targ);
- else
- while (curr > 0)
- super.swapComponents (curr, --curr);
-
- revalidate();
- repaint();
+ int layer = getLayer(c);
+ int i1 = position;
+ int i2 = getPosition(c);
+ int incr = (i1 - i2) / Math.abs(i1 - i2);
+ for (int p = i2; p != i1; p += incr)
+ swapComponents(p, p + incr, layer);
}
/**
@@ -746,4 +723,28 @@
}
return result;
}
+
+ /**
+ * Swaps the components at position i and j, in the specified layer.
+ *
+ * @param i the position of the 1st component in its layer
+ * @param j the position of the 2nd component in its layer
+ * @param layer the layer in which the components reside
+ */
+ private void swapComponents (int i, int j, int layer)
+ {
+ int p1 = Math.min(i, j);
+ int p2 = Math.max(i, j);
+ Component[] layerComps = getComponentsInLayer(layer);
+ int layerOffs = getIndexOf(layerComps[0]);
+ Component c1 = layerComps[p1];
+ Component c2 = layerComps[p2];
+ // remove() wants the real index.
+ remove(p2 + layerOffs);
+ remove(p1 + layerOffs);
+ // add() wants the position within the layer.
+ Integer l = new Integer(layer);
+ add(c2, l, p1);
+ add(c1, l, p2);
+ }
}
Index: java/awt/Container.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/Container.java,v
retrieving revision 1.76
diff -u -r1.76 Container.java
--- java/awt/Container.java 22 Jan 2006 20:23:52 -0000 1.76
+++ java/awt/Container.java 27 Jan 2006 15:46:58 -0000
@@ -188,25 +188,6 @@
}
/**
- * Swaps the components at position i and j, in the container.
- */
-
- protected void swapComponents (int i, int j)
- {
- synchronized (getTreeLock ())
- {
- if (i < 0
- || i >= component.length
- || j < 0
- || j >= component.length)
- throw new ArrayIndexOutOfBoundsException ();
- Component tmp = component[i];
- component[i] = component[j];
- component[j] = tmp;
- }
- }
-
- /**
* Returns the insets for this container, which is the space used for
* borders, the margin, etc.
*