8033786: White flashing when opening Dialogs and Menus using Nimbus with dark background
Reviewed-by: alexsch, anthony
This commit is contained in:
parent
652e8b5ffb
commit
c450cf57a3
@ -317,6 +317,8 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
||||
* 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());
|
||||
|
@ -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);
|
||||
|
@ -746,20 +746,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
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -647,6 +647,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 =
|
||||
|
@ -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");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user