Questions about JCK test failures on x86_64 Ubuntu 16.04 with openjdk8
govindan.srinivassan at oracle.com
govindan.srinivassan at oracle.com
Thu Jan 25 14:46:32 UTC 2018
Simon,
Based on your slack channel latest reply, I would consider you still
face issue only on api/java_awt/Window/indexTGF.html\#OpacityPixelChecking
If so,
- are you sure you used increased timeoutfactor (e.g -timeoutFactor) and
tried multiple times running with background white?
- Did you try with physical display?
- can you please mention, what color profile (e.g sRGB) you use in
ubuntu 16.04?
- what refresh rate is used for rendering pixels and did you try by
changing with different refresh rate?
- At last, can you please give a try on attached java code
(PixelChecking.java/DeviceInfo.java) and share us the debug info after
running PixelChecking to understand your desktop environment better?
Otherwise, as you mentioned in your findings, adding a code segment
|"Thread.sleep((long) (1000 * timeoutFactor));"
|is the only possible solution to make the test to pass in your
environment, you can file a test challenge with adequate justification like
||||||fgWindow.|||||||setOpacity(1.0f) and ||fgWindow.setBackground(fgWindowColor);|
||
not in sync, hence additional time delay is required between these two
operation. Thanks, Govindan
On 19/01/18 6:28 PM, govindan.srinivassan at oracle.com wrote:
> Hi Simon,In your given list java_awt/Window/OpacityPixelChecking_Cross
> looks like a typo and there is no such testcase, instead I will
> consider api/java_awt/Window/indexTGF.html\#ShapePixelChecking_Cross1.
> Is x86_64 with Ubuntu 16.04 a platform we would expect to run the JCK
> successfully with openjdk8? Yes, Even I tried today with Oracle
> JDK8u172b03 as well as Non commercial build (i.e openjdk), we usually
> prefer Physical display and desktop mode to run these tests.all below
> 13 tests are passing on multi jvm
> mode.api/java_awt/Window/indexTGF.html\#OpacityPixelCheckingapi/java_awt/Window/indexTGF.html\#ShapePixelCheckingapi/java_awt/Window/indexTGF.html\#ShapePixelChecking_Crossapi/java_awt/SplashScreen/CreateGraphicsTestsTsp.html\#CreateGraphicsTestsTspapi/java_awt/SplashScreen/StaticContentTestsArgGIF.html\#StaticContentTestsArgGIFapi/java_awt/SplashScreen/StaticContentTestsArgJPG.html\#StaticContentTestsArgJPGapi/java_awt/SplashScreen/StaticContentTestsArgPNG.html\#StaticContentTestsArgPNGapi/java_awt/SplashScreen/StaticContentTestsMnfGIF.html\#StaticContentTestsMnfGIFapi/java_awt/SplashScreen/StaticContentTestsMnfJPG.html\#StaticContentTestsMnfJPGapi/java_awt/SplashScreen/StaticContentTestsMnfPNG.html\#StaticContentTestsMnfPNGapi/java_awt/SplashScreen/index.html\#PrecedenceTestapi/java_awt/Frame/indexTGF.html\#GetSetExtendedStateapi/java_awt/awt_focus_subsystem/focusable_windows/index.html\#FocusableWindow3I
> agree, these are unstable tests on Ubuntu, and it’s ok if you execute
> first 3 tests in group mode (usually what we used to certify), it will
> likely to be skipped in your execution.I would suggest you to use the
> increased timeoutfactor while executing these tests, for example
> -timeoutFactor 4.0Also, while executing these tests, please try to
> have white background, possibly you can put about:blank in your
> browser window which can show white background, on top these
> background tests will render colours.2. Is x86_64 a platform with
> Ubuntu 16.04 a platform which has been tested already? Yes, we tested
> already.- If so were those runs successful? Yes, But you need to
> execute some tests multiple times to make it pass as it is computing
> pixels.- If the runs were successful what windows manager was used in
> the testing? Ubuntu 16.04 - window manager - Compiz3. On which other
> x86 linux operating systems have the awt tests been executed
> successfully, and which windows manager setup was used?OEL 6 (Oracle
> Linux - 6 and redhat compatible is 6.6)Window manager -
> matacity.Please let me know if you need jtr's for your perusal.
> Thanks,Govindan
>
>> -------- Original Message --------
>> Subject: Questions about JCK test failures on x86_64 Ubuntu 16.04
>> with openjdk8
>> Date: Wed, 10 Jan 2018 12:38:16 +0000
>> From: Simon Rushton <rushton at uk.ibm.com>
>> To: conformance-discuss at openjdk.java.net
>>
>> JCK8b is being run at the AdoptOpenJDK project with a view to marking
>> builds created at the AdoptOpenJDK site as JCK compliant. The test
>> machine is linux_x86_64 running Ubuntu 16.04. We are unable to get a
>> clean run of the JCK because a number of the JCK tests in the
>> java_awt test suite seem to be sensitive to the window manager and
>> display setup. The test results are consistent across the
>> AdoptOpenJDK builds and Oracle builds. Specifically: 1. If the
>> standard Ubuntu desktop is used (DISPLAY=:0) the following tests
>> fail: java_awt/Window/OpacityPixelChecking
>> java_awt/Window/ShapePixelChecking
>> java_awt/Window/OpacityPixelChecking_Cross The tests pass with
>> Windows 7. The OpacityPixelChecking test will pass if a delay is
>> inserted between two lines in the test case:
>> fgWindow.setOpacity(1.0f); <insert delay here>
>> fgWindow.setBackground(fgWindowColor); So perhaps the test case
>> assumes that some asynchronous activity has occurred before is
>> actually has happened? 2. If a plain Xvfb X server is used without a
>> window manager running, two java_awt tests fail which do not fail
>> with the 'real' display: a.
>> api/java_awt/awt_focus_subsystem/focusable_windows/index_FocusableWindow3.
>> - There was an issue about this test six years ago which showed on
>> OSX:
>> http://macosx-port-dev.openjdk.java.narkive.com/jcQB6tyL/7u4-review-request-for-7145827-macosx-jck-failure-in-b11-focusablewindow3-
>> it was supposedly fixed by jdk8b115. b.
>> api/java_awt/Frame/indexTGF_GetSetExtendedState - see also
>> https://bugs.openjdk.java.net/browse/JDK-7145827 - This test passes
>> when metacity is running on the Xvfb display (but see below). 3. If
>> the metacity window manager is running on the Xvfb display, the
>> api/java_awt/Frame/indexTGF_GetSetExtendedState test passes (2b.
>> above), but these tests fail instead:
>> SplashScreen/CreateGraphicsTestsTsp_CreateGraphicsTestsTsp
>> SplashScreen/StaticContentTestsArgGIF_StaticContentTestsArgGIF
>> SplashScreen/StaticContentTestsArgJPG_StaticContentTestsArgJPG
>> SplashScreen/StaticContentTestsArgPNG_StaticContentTestsArgPNG
>> SplashScreen/StaticContentTestsMnfGIF_StaticContentTestsMnfGIF
>> SplashScreen/StaticContentTestsMnfJPG_StaticContentTestsMnfJPG
>> SplashScreen/StaticContentTestsMnfPNG_StaticContentTestsMnfPNG
>> SplashScreen/index_PrecedenceTest So some questions: 1. Is x86_64
>> with Ubuntu 16.04 a platform we would expect to run the JCK
>> successfully with openjdk8? 2. Is x86_64 a platform with Ubuntu 16.04
>> a platform which has been tested already? - If so were those runs
>> successful? - If the runs were successful what windows manager was
>> used in the testing? 3. On which other x86 linux operating systems
>> have the awt tests been executed successfully, and which windows
>> manager setup was used?
>> ------------------------------------------------------------------------
>> *Simon M Rushton* Hursley Park
>> Java Test Architect Hursley, SO21 2JN
>> 430821 United Kingdom
>> IBM Software Group, Application and Integration Middleware Software
>> Phone: +44-1962-818298
>> e-mail: rushton at uk.ibm.com
>>
>> Unless stated otherwise above: IBM United Kingdom Limited -
>> Registered in England and Wales with number 741598. Registered
>> office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/conformance-discuss/attachments/20180125/8a54e144/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/gif
Size: 360 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/conformance-discuss/attachments/20180125/8a54e144/attachment-0001.gif>
-------------- next part --------------
import java.awt.*;
import javax.swing.*;
import java.lang.reflect.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
/**
* This is just a sample throw-away code, written for debugging and hence do not adhere to standard coding guidelines.
**/
public class PixelChecking {
protected double timeoutFactor = 1.0;
protected Window bgWindow;
protected Window fgWindow;
protected Robot robot;
protected int zeroX;
protected int zeroY;
public static Color[] colors = {Color.BLACK, Color.WHITE, Color.RED, Color.CYAN, Color.GREEN, Color.BLUE };
public static String colorNames[] = { "BLACK", "WHITE", "RED", "CYAN", "GREEN", "BLUE" };
public PixelChecking(Color bg, String bgColor, Color fg, String fgColor ) {
try {
setup();
run(bg, bgColor, fg, fgColor);
shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
public void setup() throws AWTException, InterruptedException, InvocationTargetException {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
bgWindow = create100x100Window();
bgWindow.setVisible(true);
bgWindow.toFront();
}
});
Thread.sleep((long) (1000 * timeoutFactor));
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
fgWindow = create100x100Window();
fgWindow.setVisible(true);
fgWindow.setAlwaysOnTop(true);
fgWindow.toFront();
try {
robot = new Robot(fgWindow.getGraphicsConfiguration().getDevice());
} catch (AWTException e) {
throw new RuntimeException(e);
}
Point zero = bgWindow.getLocationOnScreen();
zeroX = (int) zero.getX();
zeroY = (int) zero.getY();
}
});
Thread.sleep((long) (1000 * timeoutFactor));
}
public void shutdown() throws AWTException, InterruptedException, InvocationTargetException {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
fgWindow.dispose();
bgWindow.dispose();
fgWindow = null;
bgWindow = null;
}
});
Thread.sleep((long)(1000 * timeoutFactor));
}
protected boolean translucencySupported = create100x100Window()
.getGraphicsConfiguration().getDevice()
.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT);
protected BufferedImage getImage(int x, int y) {
System.out.println("Pixel Color as per Robot: " + robot.getPixelColor(zeroX + x, zeroY + y));
return robot.createScreenCapture(new Rectangle(zeroX + x, zeroY + y, 10, 10));
}
public void run (final Color bgWindowColor, String bgColorName, final Color fgWindowColor, String fgColorName) throws AWTException, InterruptedException, InvocationTargetException, IOException {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
bgWindow.setOpacity(1.0f);
bgWindow.setBackground(bgWindowColor);
fgWindow.setOpacity(1.0f);
fgWindow.setBackground(fgWindowColor);
}
});
Thread.sleep((long)(1000 * timeoutFactor));
BufferedImage bimg = getImage(0, 0);
Color pixelColor = new Color(bimg.getRGB(0, 0));
// now as fgWindow is opaque will get color of foreground window
if (!fgWindowColor.equals(pixelColor)) {
System.out.println("\nFG Window Test Failure:");
System.out.println("Expected Color " + fgWindowColor + " name: " + fgColorName);
System.out.println("Actual Color: " + pixelColor);
ImageIO.write(bimg, "png", new File(fgColorName + "fg.png"));
} else {
System.out.println("FG window check Pass for Color: " + fgColorName);
}
// making foreground window completely translucent
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
fgWindow.setOpacity(0f);
}
});
Thread.sleep((long) (1000 * timeoutFactor));
// now as fgWindow is translucent, we'll get color of bgwindow
BufferedImage bimg1 = getImage(0, 0);
pixelColor = new Color(bimg1.getRGB(0, 0));
// now as fgWindow is transparent will get color of background window
if (!bgWindowColor.equals(pixelColor)) {
System.out.println("\nBG Window Test Failure:");
System.out.println("Expected Color " + bgWindowColor + " name: " + bgColorName);
System.out.println("Actual Color: " + pixelColor);
ImageIO.write(bimg1, "png", new File(bgColorName + "bg.png"));
} else {
System.out.println("BG window check Pass for Color: " + bgColorName);
}
}
public static Window create100x100Window() {
Window window = new Window(null);
window.setSize(100,100);
// centering window on screen
window.setLocationRelativeTo(null);
return window;
}
public static void main (String args[]){
boolean isTransSupported = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT);
if (!isTransSupported) {
System.out.println("Translucency is not supported. Aborting the test");
System.exit(0);
} else {
System.out.println("Translucency is supported. Continue..");
}
DeviceInfo.getDefaultInstance().dumpDeviceInfo();
for (int i = 0; i < colors.length; i++) {
System.out.println("\n\nTest: Background color: " + colorNames[i] + " Foreground Color: " + colorNames[colors.length - (i+1)]);
PixelChecking cc = new PixelChecking(colors[i], colorNames[i], colors[colors.length-(i+1)], colorNames[colors.length - (i+1)]);
}
}
}
-------------- next part --------------
/**
* Summary: This class contains methods that are commonly used across all testcases. This class
* acts as a centralized repository for all device informations. The main purpose of this
* class is to avoid duplication of code that are mainly used to obtain the necessary
* device information such as no of devices, isMultiScreen, isVirtualScreen etc.
*
* It also by default dumps all the information to the logfile whenever a testcase tries to
* use an instance of this class and this info would really help in debugging the failures
* if there are any. This class is widely used across all testcases mainly to identify what
* kind of configuration the test is running on. This class basically gives the following
* information:
*
* 1. Indicates whether the test platform is a multi-screen platform
* 2. Indicates whether the test platform is a virtual screen platform
* 3. Tells whether the Screens are placed horizontally or veritcally or both in a virtual screen env.
* 4. Default Screen device of the configuration.
* 5. Virtual Bounds (union of bounds of all devices)
* 6. Virtual Height (intersection of heights of all devices)
* 7. Virtual Width (intersection of widths of all devices)
* 8. All devices available on the test configuration.
* 9. min screen width
* 10. min screen height
* 11. Maximum 'X' coordinate (the rightmost monitor would have the max X value in a
* virtual screen - horizontal setup)
* 12. Max 'Y' coordinate (the bottommost monitor would have the max Y value in a
* virtual screen - vertical setup)
* 13. Dumps all the device info to the log file.
*
* Author: Praveen Mohan (Java2D-SQE)
*/
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsConfiguration;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.DisplayMode;
import java.awt.BufferCapabilities;
import java.awt.ImageCapabilities;
public class DeviceInfo {
private static DeviceInfo info;
private GraphicsDevice[] gd = null;
private GraphicsDevice defDev = null;
private boolean isMultiScreen = false;
private boolean isVirtualScreen = false;
private boolean isVirtualScreenHorizontal = false;
private boolean isVirtualScreenVertical = false;
private Rectangle bounds[] = null;
/*
Can not be instantiated by the testcases directly. Just to force the
testcases to use a single shared instance.
*/
private DeviceInfo() {
gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
if (gd.length <= 1) {
isMultiScreen = false;
} else {
isMultiScreen = true;
}
bounds = new Rectangle [gd.length];
for (int x = 0; x < gd.length; x ++) {
bounds[x] = gd[x].getDefaultConfiguration().getBounds();
if (bounds[x].x > 0 || bounds[x].y > 0) {
isVirtualScreen = true;
if (bounds[x].x > 0) {
isVirtualScreenHorizontal = true;
}
if (bounds[x].y > 0) {
isVirtualScreenVertical = true;
}
}
}
dumpDeviceInfo();
}
public boolean isVirtualScreenHorizontal () {
if (isVirtualScreen) {
return isVirtualScreenHorizontal;
} else {
return isVirtualScreen;
}
}
public boolean isVirtualScreenVertical () {
if (isVirtualScreen) {
return isVirtualScreenVertical;
} else {
return isVirtualScreen;
}
}
/*
Returns the default instance of this class.
*/
public static DeviceInfo getDefaultInstance() {
if (info != null) {
return info;
} else {
info = new DeviceInfo();
}
return info;
}
/*
Returns all the graphics devices connected to the system.
*/
public GraphicsDevice[] getDevices() {
return gd;
}
/*
Returns whether this system is using multiple screens or not.
*/
public boolean isMultiScreen() {
return isMultiScreen;
}
/*
Returns whether this configuration is a virtual screen or not.
*/
public boolean isVirtualScreen() {
return isVirtualScreen;
}
/*
Returns the default Graphics Device.
*/
public GraphicsDevice getDefaultDevice() {
defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
return defDev;
}
/*
This method returns a rectangle which is a union of bounds of all
the devices connected to the system. This method does not take into
account the varying sizes of each devices and just returns the
rectangle which encloses the whole of virtual screen.
If the monitors contributing to virtual env have different widths /
heights, then findVirtualXXX() methods must be used instead of this.
If this is not a virtual screen, the bounds of the primary screen will
be returned.
*/
public Rectangle getVirtualBounds() {
if (!isVirtualScreen) {
return defDev.getDefaultConfiguration().getBounds();
}
Rectangle virtualBounds = new Rectangle();
for (int j = 0; j < gd.length; j++) {
GraphicsConfiguration[] gc = gd[j].getConfigurations();
for (int i=0; i < gc.length; i++) {
virtualBounds = virtualBounds.union(gc[i].getBounds());
}
}
return virtualBounds;
}
public int findMaxX() {
if (!isVirtualScreenHorizontal()) {
return 0;
}
int maxX = 0;
for (int x = 0; x < bounds.length; x ++) {
if (maxX <= bounds[x].x) {
maxX = bounds[x].x;
}
}
return maxX;
}
public int findMaxY() {
if (!isVirtualScreenVertical()) {
return 0;
}
int maxY = 0;
for (int x = 0; x < bounds.length; x ++) {
if (maxY <= bounds[x].y) {
maxY = bounds[x].y;
}
}
return maxY;
}
/*
This method calculates the width of the virtual screen. It basically identifies the
the screen having highest 'X' value and adds it's width to the X value.
If all the screens are having a '0' X value, then it is a vertical multi-monitor
setup (screens placed one below the other). In that case, it takes the minimum
width of all the screens. Virtual screen will have a bigger height in this case.
If this is not a virtual screen setup, width of the primary screen will be
returned.
*/
public int findVirtualWidth () {
if (!isVirtualScreen) {
return defDev.getDefaultConfiguration().getBounds().width;
}
int width = 0;
int maxX = 0;
int index = 0;
for (int x = 0; x < bounds.length; x ++) {
if (maxX <= bounds[x].x) {
maxX = bounds[x].x;
index = x;
}
}
if (maxX == 0) {
width = maxX + findMinScreenWidth();
} else {
width = maxX + bounds[index].width;
}
return width;
}
/*
This method calculates the height of the virtual screen. It basically identifies the
the screen having highest 'Y' value and adds it's height to the highest Y value.
If all the screens are having a '0' Y value, then it is a horizontal multi-monitor
setup. In that case, it takes the minimum height of all the screens. Virtual Screen will
have a bigger width in this case. (Screens are placed to the right / left of the other)
If this is not a virtual screen setup, height of the primary screen will be
returned.
*/
public int findVirtualHeight () {
if (!isVirtualScreen) {
return defDev.getDefaultConfiguration().getBounds().height;
}
int height = 0;
int maxY = 0;
int index = 0;
for (int x = 0; x < bounds.length; x ++) {
if (maxY <= bounds[x].y) {
maxY = bounds[x].y;
index = x;
}
}
if (maxY == 0) {
height = maxY + findMinScreenHeight();
} else {
height = maxY + bounds[index].height;
};
return height;
}
/*
This method aims at finding out the screen having the minimal width. If the screens
configured on the multi-monitor setup are having different widths and if it is a
vertical multi-monitor setup, then the screen capture must be done with respect to
the minimal screen width in order to avoid black areas in the captured image. If we
capture the screen with respect to the max width, then some portions of the image would
appear black since those areas are non-existant on some of the monitors.
*/
public int findMinScreenWidth() {
int minWidth = bounds[0].width;
for (int x = 0; x < bounds.length; x ++) {
if (minWidth >= bounds[x].width) {
minWidth = bounds[x].width;
}
}
return minWidth;
}
/*
This method aims at finding out the screen having the minimal height. If the screens
configured on the multi-monitor setup are having different heights and if it is a
horizontal multi-monitor setup, then the screen capture must be done with respect to
the minimal screen height in order to avoid black areas in the captured image. If we
capture the screen with respect to the max height, then some portions of the image would
appear black since those areas are non-existant on some of the monitors.
*/
public int findMinScreenHeight() {
int minHeight = bounds[0].height;
for (int x = 0; x < bounds.length; x ++) {
if (minHeight >= bounds[x].height) {
minHeight = bounds[x].height;
}
}
return minHeight;
}
public void dumpDeviceInfo () {
System.out.println("\n=============== Device Information ===========================");
System.out.println("No of devices: " + gd.length);
System.out.println("\nAvailable Devices");
System.out.println("-----------------");
for (int x = 0; x < gd.length; x ++) {
System.out.println("\nGraphics Device " + x + ": " + gd[x]);
System.out.println ("\nAvailable Graphics Configs");
System.out.println ("--------------------------");
GraphicsConfiguration gc[] = gd[x].getConfigurations();
for (int y = 0; y < gc.length; y ++) {
System.out.println("GraphicsConfig " + y + ": " + gc[y] + "\nBounds: " + gc[y].getBounds());
System.out.println("Screen Insets for this GC: " + Toolkit.getDefaultToolkit().getScreenInsets(gc[y]));
System.out.println("\n");
BufferCapabilities buffCap = gc[y].getBufferCapabilities();
System.out.println("is MultiBuffer Available: " + buffCap.isMultiBufferAvailable());
System.out.println("is Page Flipping?: " + buffCap.isPageFlipping());
System.out.println("is FullScreen Required?: " + buffCap.isFullScreenRequired());
ImageCapabilities imageCap = gc[y].getImageCapabilities();
System.out.println("is Accelerated?: " + imageCap.isAccelerated());
System.out.println("is True Volatile?: " + imageCap.isTrueVolatile());
System.out.println("\n");
}
System.out.println("\nDefault Config: " + gd[x].getDefaultConfiguration() + "\nBounds: " +
gd[x].getDefaultConfiguration().getBounds());
System.out.println("Screen Insets for default GC: " + Toolkit.getDefaultToolkit().getScreenInsets(
gd[x].getDefaultConfiguration()));
System.out.println("Accelerated Memory: " + gd[x].getAvailableAcceleratedMemory());
DisplayMode dm = gd[x].getDisplayMode();
System.out.println("Current Display Mode: width: " + dm.getWidth() +
" height: " + dm.getHeight() + " Color Depth: " + dm.getBitDepth() +
" Refresh Rate: " + dm.getRefreshRate());
}
System.out.println("\nDefault Device: " + getDefaultDevice());
System.out.println ("\nisMultiScreen? " + isMultiScreen);
System.out.println ("isVirtualScreen? " + isVirtualScreen);
System.out.println ("isVirtualScreenHorizontal? " + isVirtualScreenHorizontal);
System.out.println ("isVirtualScreenVertical? " + isVirtualScreenVertical);
if (isVirtualScreen) {
System.out.println("\nVirtual Bounds (Union): " + getVirtualBounds());
System.out.println("Virtual Width (Intersection): " + findVirtualWidth());
System.out.println("Virtual Height (Intersection): " + findVirtualHeight());
}
System.out.println("\nMax Window Bounds: " + GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds());
System.out.println("Screen Size: " + Toolkit.getDefaultToolkit().getScreenSize());
System.out.println("\n==============================================================");
}
}
More information about the conformance-discuss
mailing list