diff options
author | Jiri Vanek <[email protected]> | 2014-01-20 15:13:36 +0100 |
---|---|---|
committer | Jiri Vanek <[email protected]> | 2014-01-20 15:13:36 +0100 |
commit | 00ead2135a876523108cbbe03224e94da67a7293 (patch) | |
tree | ab10bdc59f02c4e2b7e60074a31dcc59af09bf80 | |
parent | c6f420acd38b2036d17685efde866debc627c26e (diff) |
Added Christmas splashscreen extension.
9 files changed, 494 insertions, 11 deletions
@@ -1,5 +1,25 @@ 2014-01-20 Jiri Vanek <[email protected]> + Added Christmas splashscreen extension. + * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java: + base colors are derived from active extension. And extension is painted (if any) + * netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java: + same + * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java: + extension valid in Christmas time, painting falling stars and dimming colors. + * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java + provider of extension. Know only the Christmas one right now. + * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java: + no op extension for no extension times + * netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java: + unfinished extension interface + * tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java: + and + * tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java: + adapted to current purposes + +2014-01-20 Jiri Vanek <[email protected]> + Added support for system level linux logging * netx/net/sourceforge/jnlp/util/logging/OutputController.java: exclusive handling for system critical *java* messages when system logging is on. diff --git a/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java b/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java index 93905fe..3da2957 100644 --- a/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java +++ b/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/BasePainter.java @@ -62,6 +62,7 @@ import net.sourceforge.jnlp.splashscreen.SplashUtils.SplashReason; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; import net.sourceforge.jnlp.splashscreen.parts.InfoItem; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; +import net.sourceforge.jnlp.splashscreen.parts.extensions.ExtensionManager; import net.sourceforge.jnlp.util.logging.OutputController; import net.sourceforge.jnlp.util.ScreenFinder; @@ -76,11 +77,11 @@ public class BasePainter implements Observer { private int greyTextIncrment = 15; //how quickly is greyed web moving //colors protected static final Color TEA_LIVE_COLOR = new Color(205, 1, 3); - protected static final Color BACKGROUND_LIVE_COLOR = Color.white; + protected static final Color BACKGROUND_LIVE_COLOR = ExtensionManager.getExtension().getBackground(); protected static final Color TEA_LEAFS_STALKS_LIVE_COLOR = Color.black; - protected static final Color PLUGIN_LIVE_COLOR = Color.black; - protected static final Color WATER_LIVE_COLOR = new Color(80, 131, 160); - protected static final Color PLAIN_TEXT_LIVE_COLOR = Color.black; + protected static final Color PLUGIN_LIVE_COLOR = ExtensionManager.getExtension().getPluginTextColor(); + public static final Color WATER_LIVE_COLOR = new Color(80, 131, 160); + protected static final Color PLAIN_TEXT_LIVE_COLOR = ExtensionManager.getExtension().getTextColor(); protected Color teaColor; protected Color backgroundColor; protected Color teaLeafsStalksColor; @@ -237,6 +238,7 @@ public class BasePainter implements Observer { this.master = master; setColors(); adjustForSize(master.getSplashWidth(), master.getSplashHeight()); + ExtensionManager.getExtension().adjustForSize(master.getSplashWidth(), master.getSplashHeight()); if (startAnimation) { startAnimationThreads(); } @@ -244,6 +246,7 @@ public class BasePainter implements Observer { } public void increaseAnimationPosition() { + ExtensionManager.getExtension().animate(); animationsPosition += greyTextIncrment; } @@ -261,6 +264,7 @@ public class BasePainter implements Observer { } if (showNiceTexts) { + ExtensionManager.getExtension().paint(g, this); paintNiceTexts(g2d); } else { paintPlainTexts(g2d); @@ -275,6 +279,7 @@ public class BasePainter implements Observer { //enablings depends on fonts setEnablings(width, height, master.getVersion(), master.getInformationElement(), (Graphics2D) (master.getGraphics())); prerenderedStuff = prerenderStill(); + ExtensionManager.getExtension().adjustForSize(width, height); } private void setEnablings(int w, int h, String version, InformationElement ic, Graphics2D g2d) { @@ -567,6 +572,7 @@ public class BasePainter implements Observer { @Override public void run() { + ExtensionManager.getExtension().animate(); master.repaint(); } }); @@ -583,7 +589,12 @@ public class BasePainter implements Observer { return aboutOfset; } + public Color getWaterColor() { + return waterColor; + } + public Color getBackgroundColor() { + return backgroundColor; + } - } diff --git a/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java b/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java index 7374dbd..4413606 100644 --- a/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java +++ b/netx/net/sourceforge/jnlp/splashscreen/impls/defaultsplashscreen2012/ErrorPainter.java @@ -48,6 +48,7 @@ import java.util.Observable; import net.sourceforge.jnlp.runtime.Translator; import net.sourceforge.jnlp.splashscreen.parts.BasicComponentSplashScreen; import net.sourceforge.jnlp.splashscreen.parts.InformationElement; +import net.sourceforge.jnlp.splashscreen.parts.extensions.ExtensionManager; import net.sourceforge.jnlp.util.logging.OutputController; public final class ErrorPainter extends BasePainter { @@ -130,6 +131,7 @@ public final class ErrorPainter extends BasePainter { } if (super.showNiceTexts) { + ExtensionManager.getExtension().paint(g, this); paintNiceTexts(g2d); } else { paintPlainTexts(g2d); diff --git a/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java new file mode 100644 index 0000000..38d27d5 --- /dev/null +++ b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ChristmasExtension.java @@ -0,0 +1,257 @@ +/* + Copyright (C) 2012 Red Hat, Inc. + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + IcedTea 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 for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ +package net.sourceforge.jnlp.splashscreen.parts.extensions; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Polygon; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; +import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.ErrorPainter; + +public class ChristmasExtension implements SplashExtension { + + @Override + public Color getBackground() { + return Color.black; + } + + @Override + public Color getTextColor() { + return Color.DARK_GRAY; + } + + @Override + public Color getPluginTextColor() { + return new Color(30, 30, 30); + } + + ChristmasExtension() { + this(0, 0); + } + private static final Random seed = new Random(); + private static final int avarege_star_width = 10; //stars will be 5-15 + private final int avarege_fall_speed = 4; //2-6 + private final int avarege_rotation_speed = 2; //1-3 + + private class Star { + + private int radiusX; + private int radiusY; + private int maxRadiusX; + private int maxRadiusY; + private int centerX; + private int centerY; + private final int fallSpeed; + private final boolean orientation; + private final int[] originalColor = new int[3]; + private final int[] color = new int[originalColor.length]; + private int direction; + private final boolean haveEight; + + public Star() { + createRadiuses(); + haveEight = seed.nextBoolean(); + this.centerX = seed.nextInt(w + 1); + this.centerY = seed.nextInt(h + 1); + this.fallSpeed = avarege_fall_speed / 2 + seed.nextInt(avarege_fall_speed / 2); + this.orientation = seed.nextBoolean(); + this.direction = -(avarege_rotation_speed / 2 + seed.nextInt(avarege_rotation_speed / 2)); + if (seed.nextInt(4) == 0) { + originalColor[0] = Color.yellow.getRed(); + originalColor[1] = Color.yellow.getGreen(); + originalColor[2] = Color.yellow.getBlue(); + } else { + originalColor[0] = BasePainter.WATER_LIVE_COLOR.getRed(); + originalColor[1] = BasePainter.WATER_LIVE_COLOR.getGreen(); + originalColor[2] = BasePainter.WATER_LIVE_COLOR.getBlue(); + } + } + + public void paint(Graphics g, Color forceColor1, Color forceColor2) { + Color c = g.getColor(); + if (forceColor1 == null || forceColor2 == null) { + g.setColor(new Color(color[0], color[1], color[2])); + } else { + g.setColor(ErrorPainter.interpolateColor(h, centerY, forceColor1, forceColor2)); + } + Polygon p = createPolygon(); + if (haveEight) { + int min1 = Math.min(radiusX, radiusY); + int min2 = min1 / 2; + g.fillRect(centerX - min2, centerY - min2, min1, min1); + } + g.fillPolygon(p); + g.setColor(c); + } + + private void animate() { + centerY += fallSpeed; + if (orientation) { + radiusX += direction; + if (radiusX <= -direction) { + direction = -direction; + radiusX = direction; + } + if (radiusX >= maxRadiusX) { + direction = -direction; + radiusX = maxRadiusX; + } + interpolateColors(radiusX, maxRadiusX); + } else { + radiusY += direction; + if (radiusY <= -direction) { + direction = -direction; + radiusY = direction; + } + if (radiusY >= maxRadiusY) { + direction = -direction; + radiusY = maxRadiusY; + } + interpolateColors(radiusY, maxRadiusY); + } + if (centerY > h + radiusX * 2 || centerY > h + radiusY * 2) { + createRadiuses(); + this.centerX = seed.nextInt(w + 1); + this.centerY = -radiusY * 2; + } + } + + private int createRadius() { + return avarege_star_width / 2 + seed.nextInt(avarege_star_width); + } + + private Polygon createPolygon() { + int min = Math.min(radiusX, radiusY) / 3; + Polygon p = new Polygon(); + p.addPoint(centerX - radiusX, centerY); + p.addPoint(centerX - min, centerY - min); + p.addPoint(centerX, centerY - radiusY); + p.addPoint(centerX + min, centerY - min); + p.addPoint(centerX + radiusX, centerY); + p.addPoint(centerX + min, centerY + min); + p.addPoint(centerX, centerY + radiusY); + p.addPoint(centerX - min, centerY + min); + return p; + } + + private void interpolateColors(int is, int max) { + for (int i = 0; i < originalColor.length; i++) { + int fadeMin; + if (centerY < 0) { + fadeMin = 0; + } else if (centerY > h) { + fadeMin = 255; + } else { + fadeMin = (int) ErrorPainter.interpol(h, centerY, 255, 0); //from white to black + } + int fadeMax; + if (centerY < 0) { + fadeMax = 0; + } else if (centerY > h) { + fadeMax = originalColor[i]; + } else { + fadeMax = (int) ErrorPainter.interpol(h, centerY, originalColor[i], 0); //from color tho black + } + color[i] = (int) ErrorPainter.interpol(max, is, fadeMin, fadeMax); + } + } + + private void createRadiuses() { + this.radiusX = createRadius(); + this.radiusY = radiusX; + switch (seed.nextInt(3)) { + case (0): + radiusX = radiusX + (2 * radiusX) / 3; + break; + case (1): + radiusY = radiusY + (2 * radiusY) / 3; + break; + case (2): + //noop + break; + } + maxRadiusX = radiusX; + maxRadiusY = radiusY; + } + } + private int w; + private int h; + private List<Star> stars = new ArrayList<Star>(50); + + ChristmasExtension(int w, int h) { + adjustForSize(w, h); + } + + @Override + public void paint(Graphics g, BasePainter b) { + for (ChristmasExtension.Star star : stars) { + Color forceColor1 = null; + Color forceColor2 = null; + if (b instanceof ErrorPainter){ + forceColor1 = b.getBackgroundColor(); + forceColor2 = b.getWaterColor(); + } + star.paint(g, forceColor1, forceColor2); + } + } + + @Override + public void animate() { + for (ChristmasExtension.Star star : stars) { + star.animate(); + + } + } + + @Override + public final void adjustForSize(int w, int h) { + this.w = w; + this.h = h; + int count = w / (2 * (avarege_star_width + 1)); + while (stars.size() > count) { + stars.remove(stars.size() - 1); + } + while (stars.size() < count) { + stars.add(new Star()); + + } + + } +} diff --git a/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java new file mode 100644 index 0000000..34774f4 --- /dev/null +++ b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/ExtensionManager.java @@ -0,0 +1,63 @@ +/* + Copyright (C) 2012 Red Hat, Inc. + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + IcedTea 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 for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ +package net.sourceforge.jnlp.splashscreen.parts.extensions; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class ExtensionManager { + + private static SplashExtension currentExtension; + + public static SplashExtension getExtension() { + if (currentExtension == null) { + if (areChristmas()) { + currentExtension = new ChristmasExtension(); + } else { + currentExtension = new NoExtension(); + } + } + return currentExtension; + } + + private static boolean areChristmas() { + Calendar c = new GregorianCalendar(); + c.setTime(new Date()); + return c.get(Calendar.DAY_OF_YEAR) > 350; + } +} diff --git a/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java new file mode 100644 index 0000000..2266a98 --- /dev/null +++ b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/NoExtension.java @@ -0,0 +1,75 @@ +/* + Copyright (C) 2012 Red Hat, Inc. + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + IcedTea 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 for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ +package net.sourceforge.jnlp.splashscreen.parts.extensions; + +import java.awt.Color; +import java.awt.Graphics; +import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; + +public class NoExtension implements SplashExtension{ + + public NoExtension() { + } + + @Override + public Color getBackground() { + return Color.white; + } + + @Override + public Color getTextColor() { + return Color.black; + } + + @Override + public Color getPluginTextColor() { + return Color.black; + } + + @Override + public void adjustForSize(int w, int h) { + } + + @Override + public void animate() { + } + + @Override + public void paint(Graphics g, BasePainter origin) { + } + +} diff --git a/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java new file mode 100644 index 0000000..4c9b7ce --- /dev/null +++ b/netx/net/sourceforge/jnlp/splashscreen/parts/extensions/SplashExtension.java @@ -0,0 +1,52 @@ +/* + Copyright (C) 2012 Red Hat, Inc. + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + IcedTea 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 for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ +package net.sourceforge.jnlp.splashscreen.parts.extensions; + +import java.awt.Color; +import java.awt.Graphics; +import net.sourceforge.jnlp.splashscreen.impls.defaultsplashscreen2012.BasePainter; + +public interface SplashExtension { + + public Color getBackground() ; + public Color getTextColor() ; + public Color getPluginTextColor(); + public void adjustForSize(int w, int h) ; + public void paint(Graphics g, BasePainter origin) ; + public void animate(); + +} diff --git a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java index 7772237..29d7634 100644 --- a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java +++ b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/ErrorSplashScreenTest.java @@ -143,6 +143,7 @@ public class ErrorSplashScreenTest extends JDialog { public static void main(String args[]) { ErrorSplashScreenTest app = new ErrorSplashScreenTest(); + app.setSize(800, 600); app.setVisible(true); app.addWindowListener( new WindowAdapter() { diff --git a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java index 44b1271..bb513e5 100644 --- a/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java +++ b/tests/netx/unit/net/sourceforge/jnlp/splashscreen/SplashScreenTest.java @@ -57,6 +57,7 @@ public class SplashScreenTest extends JDialog { static int height = JNLPSplashScreen.DEF_HEIGHT; static SplashPanel panel; private static boolean swap = true; + private static InformationElement ie = new InformationElement(); public SplashScreenTest() { @@ -67,8 +68,7 @@ public class SplashScreenTest extends JDialog { //setLocation(x, y); setLocationRelativeTo(null); this.pack(); - panel = SplashUtils.getSplashScreen(width, height, SplashUtils.SplashReason.JAVAWS); - InformationElement ie = new InformationElement(); + panel = SplashUtils.getSplashScreen(width, height, SplashUtils.SplashReason.APPLET); ie.setHomepage("http://someones.org/amazing?page"); ie.setTitle("Testing information title"); ie.setvendor("IcedTea-Web team"); @@ -145,6 +145,7 @@ public class SplashScreenTest extends JDialog { public static void main(String args[]) { SplashScreenTest app = new SplashScreenTest(); + app.setSize(800, 600); app.setVisible(true); app.addWindowListener( @@ -165,7 +166,8 @@ public class SplashScreenTest extends JDialog { //not needed //panel.stopAnimation(); if (swap) { - SplashErrorPanel r = SplashUtils.getErrorSplashScreen(panel.getSplashWidth(), panel.getSplashHeight(), SplashUtils.SplashReason.JAVAWS, null); + SplashErrorPanel r = SplashUtils.getErrorSplashScreen(panel.getSplashWidth(), panel.getSplashHeight(), SplashUtils.SplashReason.APPLET, null); + r.setInformationElement(ie); app.remove(panel.getSplashComponent()); r.setPercentage(panel.getPercentage()); r.adjustForSize(); @@ -174,9 +176,9 @@ public class SplashScreenTest extends JDialog { panel.setVersion("1.2-re45fdg"); app.add(panel.getSplashComponent()); - app.validateTree(); - //app.pack(); - //app.setVisible(true); + app.validate(); + app.pack(); + app.setVisible(true); try { Thread.sleep(10000); } catch (Exception e) { |