< prev index next >

src/java.desktop/share/classes/java/awt/Component.java

Print this page

        

*** 841,876 **** } public Rectangle getBounds(Component comp) { return new Rectangle(comp.x, comp.y, comp.width, comp.height); } public void setMixingCutoutShape(Component comp, Shape shape) { ! Region region = shape == null ? null : ! Region.getInstance(shape, null); ! ! synchronized (comp.getTreeLock()) { ! boolean needShowing = false; ! boolean needHiding = false; ! ! if (!comp.isNonOpaqueForMixing()) { ! needHiding = true; ! } ! ! comp.mixingCutoutRegion = region; ! ! if (!comp.isNonOpaqueForMixing()) { ! needShowing = true; ! } ! ! if (comp.isMixingNeeded()) { ! if (needHiding) { ! comp.mixOnHiding(comp.isLightweight()); ! } ! if (needShowing) { ! comp.mixOnShowing(); ! } ! } ! } } public void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc) { --- 841,851 ---- } public Rectangle getBounds(Component comp) { return new Rectangle(comp.x, comp.y, comp.width, comp.height); } public void setMixingCutoutShape(Component comp, Shape shape) { ! comp.setMixingCutoutShape(shape); } public void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc) {
*** 10236,10245 **** --- 10211,10285 ---- return false; } return true; } + /** + * Sets a 'mixing-cutout' shape for the given component. + * + * By default a lightweight component is treated as an opaque rectangle for + * the purposes of the Heavyweight/Lightweight Components Mixing feature. + * This method enables developers to set an arbitrary shape to be cut out + * from heavyweight components positioned underneath the lightweight + * component in the z-order. + * <p> + * The {@code shape} argument may have the following values: + * <ul> + * <li>{@code null} - reverts the default cutout shape (the rectangle equal + * to the component's {@code getBounds()}) + * <li><i>empty-shape</i> - does not cut out anything from heavyweight + * components. This makes the given lightweight component effectively + * transparent. Note that descendants of the lightweight component still + * affect the shapes of heavyweight components. An example of an + * <i>empty-shape</i> is {@code new Rectangle()}. + * <li><i>non-empty-shape</i> - the given shape will be cut out from + * heavyweight components. + * </ul> + * <p> + * The most common example when the 'mixing-cutout' shape is needed is a + * glass pane component. The {@link JRootPane#setGlassPane()} method + * automatically sets the <i>empty-shape</i> as the 'mixing-cutout' shape + * for the given glass pane component. If a developer needs some other + * 'mixing-cutout' shape for the glass pane (which is rare), this must be + * changed manually after installing the glass pane to the root pane. + * <p> + * Note that the 'mixing-cutout' shape neither affects painting, nor the + * mouse events handling for the given component. It is used exclusively + * for the purposes of the Heavyweight/Lightweight Components Mixing + * feature. + * + * @param shape the new 'mixing-cutout' shape + * @since 9 + */ + void setMixingCutoutShape(Shape shape) { + Region region = shape == null ? null : Region.getInstance(shape, null); + + synchronized (getTreeLock()) { + boolean needShowing = false; + boolean needHiding = false; + + if (!isNonOpaqueForMixing()) { + needHiding = true; + } + + mixingCutoutRegion = region; + + if (!isNonOpaqueForMixing()) { + needShowing = true; + } + + if (isMixingNeeded()) { + if (needHiding) { + mixOnHiding(isLightweight()); + } + if (needShowing) { + mixOnShowing(); + } + } + } + } + // ****************** END OF MIXING CODE ******************************** // Note that the method is overriden in the Window class, // a window doesn't need to be updated in the Z-order. void updateZOrder() {
< prev index next >