diff --git a/src/macosx/classes/sun/lwawt/LWComponentPeer.java b/src/macosx/classes/sun/lwawt/LWComponentPeer.java index 5880d06be4d50c9fb60ccc5ede3e7c8422a6d21d..66fa8276c69a12159867f45864c58801346b7da6 100644 --- a/src/macosx/classes/sun/lwawt/LWComponentPeer.java +++ b/src/macosx/classes/sun/lwawt/LWComponentPeer.java @@ -319,6 +319,8 @@ public abstract class LWComponentPeer * subclasses to initialize specific peers properties. */ void initializeImpl() { + // note that these methods can be overridden by the user and + // can return some strange values like null. setBackground(target.getBackground()); setForeground(target.getForeground()); setFont(target.getFont()); diff --git a/src/macosx/classes/sun/lwawt/LWWindowPeer.java b/src/macosx/classes/sun/lwawt/LWWindowPeer.java index 226d8c68699de5310c01c53842dd97755e7fae23..b72ef77d876ff5661f76a1300f5726a82b69df92 100644 --- a/src/macosx/classes/sun/lwawt/LWWindowPeer.java +++ b/src/macosx/classes/sun/lwawt/LWWindowPeer.java @@ -443,6 +443,12 @@ public class LWWindowPeer getPlatformWindow().updateIconImages(); } + @Override + public void setBackground(final Color c) { + super.setBackground(c); + updateOpaque(); + } + @Override public void setOpacity(float opacity) { getPlatformWindow().setOpacity(opacity); diff --git a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index 44116e73ce54ab98ec790256a6add1b565c7e2b4..aa21535d3a65f70e122c979ef74498fb43ef6ceb 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -747,20 +747,22 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo @Override public void setOpaque(boolean isOpaque) { CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque); - boolean isTextured = (peer == null)? false : peer.isTextured(); - if (!isOpaque && !isTextured) { - long clearColor = CWrapper.NSColor.clearColor(); - CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), clearColor); + boolean isTextured = (peer == null) ? false : peer.isTextured(); + if (!isTextured) { + if (!isOpaque) { + CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), 0); + } else if (peer != null) { + Color color = peer.getBackground(); + if (color != null) { + int rgb = color.getRGB(); + CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), rgb); + } + } } //This is a temporary workaround. Looks like after 7124236 will be fixed //the correct place for invalidateShadow() is CGLayer.drawInCGLContext. - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - invalidateShadow(); - } - }); + SwingUtilities.invokeLater(this::invalidateShadow); } @Override diff --git a/src/macosx/classes/sun/lwawt/macosx/CWrapper.java b/src/macosx/classes/sun/lwawt/macosx/CWrapper.java index 8c2e9c01f2d07ff1d29093bd61456f92cea2940e..f0fec624d8d4102e0c6f6c34eed3c2c333cf744f 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CWrapper.java +++ b/src/macosx/classes/sun/lwawt/macosx/CWrapper.java @@ -61,7 +61,14 @@ final class CWrapper { static native void setAlphaValue(long window, float alpha); static native void setOpaque(long window, boolean opaque); - static native void setBackgroundColor(long window, long color); + + /** + * Sets background color of the NSWindow. + * + * @param window the pointer of the NSWindow + * @param color the color in argb format + */ + static native void setBackgroundColor(long window, int color); static native void miniaturize(long window); static native void deminiaturize(long window); @@ -82,8 +89,4 @@ final class CWrapper { static native void setToolTip(long view, String msg); } - - static final class NSColor { - static native long clearColor(); - } } diff --git a/src/macosx/native/sun/awt/CWrapper.m b/src/macosx/native/sun/awt/CWrapper.m index 247358f0df98d4dba0796721811df49b0ca2983c..bf0d6b2fccd0e1f61ea9302cb4dc2802bdfc32d4 100644 --- a/src/macosx/native/sun/awt/CWrapper.m +++ b/src/macosx/native/sun/awt/CWrapper.m @@ -337,12 +337,17 @@ JNF_COCOA_EXIT(env); */ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor -(JNIEnv *env, jclass cls, jlong windowPtr, jlong colorPtr) +(JNIEnv *env, jclass cls, jlong windowPtr, jint rgb) { JNF_COCOA_ENTER(env); NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); - NSColor *color = (NSColor *)jlong_to_ptr(colorPtr); + CGFloat alpha = (((rgb >> 24) & 0xff) / 255.0); + CGFloat red = (((rgb >> 16) & 0xff) / 255.0); + CGFloat green = (((rgb >> 8) & 0xff) / 255.0); + CGFloat blue = (((rgb >> 0) & 0xff) / 255.0); + NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue + alpha:alpha]; [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ [window setBackgroundColor:color]; }]; @@ -575,26 +580,3 @@ JNF_COCOA_ENTER(env); JNF_COCOA_EXIT(env); } - -/* - * Class: sun_lwawt_macosx_CWrapper$NSColor - * Method: clearColor - * Signature: ()J - */ -JNIEXPORT jlong JNICALL -Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor -(JNIEnv *env, jclass cls) -{ - __block jlong clearColorPtr = 0L; - -JNF_COCOA_ENTER(env); - - [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - clearColorPtr = ptr_to_jlong([NSColor clearColor]); - }]; - -JNF_COCOA_EXIT(env); - - return clearColorPtr; -} - diff --git a/src/share/classes/javax/swing/JDialog.java b/src/share/classes/javax/swing/JDialog.java index 4ae5e434c3410af32f9890fceb039d29fa067dde..51228851fa1f4e6bddb8024a8cb85a2d2087e58c 100644 --- a/src/share/classes/javax/swing/JDialog.java +++ b/src/share/classes/javax/swing/JDialog.java @@ -646,6 +646,7 @@ public class JDialog extends Dialog implements WindowConstants, enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK); setLocale( JComponent.getDefaultLocale() ); setRootPane(createRootPane()); + setBackground(UIManager.getColor("control")); setRootPaneCheckingEnabled(true); if (JDialog.isDefaultLookAndFeelDecorated()) { boolean supportsWindowDecorations = diff --git a/test/javax/swing/JDialog/WrongBackgroundColor/WrongBackgroundColor.java b/test/javax/swing/JDialog/WrongBackgroundColor/WrongBackgroundColor.java new file mode 100644 index 0000000000000000000000000000000000000000..63b6e71cbf53240f29a9fc41cf8cc212f2932005 --- /dev/null +++ b/test/javax/swing/JDialog/WrongBackgroundColor/WrongBackgroundColor.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Color; +import java.lang.reflect.InvocationTargetException; + +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import javax.swing.UIDefaults; +import javax.swing.UIManager; +import javax.swing.plaf.ColorUIResource; + +/** + * @test + * @bug 8033786 + * @summary JDialog should update background color of the native peer. + * @author Sergey Bylokhov + */ +public final class WrongBackgroundColor { + + public static void main(final String[] args) + throws InvocationTargetException, InterruptedException { + SwingUtilities.invokeAndWait(() -> { + UIDefaults ui = UIManager.getDefaults(); + ui.put("control", new ColorUIResource(54, 54, 54)); + final JDialog dialog = new JDialog(); + final JFrame frame = new JFrame(); + frame.pack(); + dialog.pack(); + final Color dialogBackground = dialog.getBackground(); + final Color frameBackground = frame.getBackground(); + frame.dispose(); + dialog.dispose(); + if (!dialogBackground.equals(frameBackground)) { + System.err.println("Expected:" + frameBackground); + System.err.println("Actual:" + dialogBackground); + throw new RuntimeException("Wrong background color"); + } + }); + } +}