提交 39f03ee9 编写于 作者: S serb

8033786: White flashing when opening Dialogs and Menus using Nimbus with dark background

Reviewed-by: alexsch, anthony
上级 d6eb9cc7
...@@ -319,6 +319,8 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -319,6 +319,8 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
* subclasses to initialize specific peers properties. * subclasses to initialize specific peers properties.
*/ */
void initializeImpl() { void initializeImpl() {
// note that these methods can be overridden by the user and
// can return some strange values like null.
setBackground(target.getBackground()); setBackground(target.getBackground());
setForeground(target.getForeground()); setForeground(target.getForeground());
setFont(target.getFont()); setFont(target.getFont());
......
...@@ -443,6 +443,12 @@ public class LWWindowPeer ...@@ -443,6 +443,12 @@ public class LWWindowPeer
getPlatformWindow().updateIconImages(); getPlatformWindow().updateIconImages();
} }
@Override
public void setBackground(final Color c) {
super.setBackground(c);
updateOpaque();
}
@Override @Override
public void setOpacity(float opacity) { public void setOpacity(float opacity) {
getPlatformWindow().setOpacity(opacity); getPlatformWindow().setOpacity(opacity);
......
...@@ -747,20 +747,22 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -747,20 +747,22 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
@Override @Override
public void setOpaque(boolean isOpaque) { public void setOpaque(boolean isOpaque) {
CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque); CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque);
boolean isTextured = (peer == null)? false : peer.isTextured(); boolean isTextured = (peer == null) ? false : peer.isTextured();
if (!isOpaque && !isTextured) { if (!isTextured) {
long clearColor = CWrapper.NSColor.clearColor(); if (!isOpaque) {
CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), clearColor); 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 //This is a temporary workaround. Looks like after 7124236 will be fixed
//the correct place for invalidateShadow() is CGLayer.drawInCGLContext. //the correct place for invalidateShadow() is CGLayer.drawInCGLContext.
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(this::invalidateShadow);
@Override
public void run() {
invalidateShadow();
}
});
} }
@Override @Override
......
...@@ -61,7 +61,14 @@ final class CWrapper { ...@@ -61,7 +61,14 @@ final class CWrapper {
static native void setAlphaValue(long window, float alpha); static native void setAlphaValue(long window, float alpha);
static native void setOpaque(long window, boolean opaque); 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 miniaturize(long window);
static native void deminiaturize(long window); static native void deminiaturize(long window);
...@@ -82,8 +89,4 @@ final class CWrapper { ...@@ -82,8 +89,4 @@ final class CWrapper {
static native void setToolTip(long view, String msg); static native void setToolTip(long view, String msg);
} }
static final class NSColor {
static native long clearColor();
}
} }
...@@ -337,12 +337,17 @@ JNF_COCOA_EXIT(env); ...@@ -337,12 +337,17 @@ JNF_COCOA_EXIT(env);
*/ */
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor 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); JNF_COCOA_ENTER(env);
NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 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:^(){ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[window setBackgroundColor:color]; [window setBackgroundColor:color];
}]; }];
...@@ -575,26 +580,3 @@ JNF_COCOA_ENTER(env); ...@@ -575,26 +580,3 @@ JNF_COCOA_ENTER(env);
JNF_COCOA_EXIT(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;
}
...@@ -646,6 +646,7 @@ public class JDialog extends Dialog implements WindowConstants, ...@@ -646,6 +646,7 @@ public class JDialog extends Dialog implements WindowConstants,
enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK); enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK);
setLocale( JComponent.getDefaultLocale() ); setLocale( JComponent.getDefaultLocale() );
setRootPane(createRootPane()); setRootPane(createRootPane());
setBackground(UIManager.getColor("control"));
setRootPaneCheckingEnabled(true); setRootPaneCheckingEnabled(true);
if (JDialog.isDefaultLookAndFeelDecorated()) { if (JDialog.isDefaultLookAndFeelDecorated()) {
boolean supportsWindowDecorations = boolean supportsWindowDecorations =
......
/*
* 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");
}
});
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册