src/demo/share/jfc/J2Ddemo/java2d/J2Ddemo.java
changeset 50146 0bb0e464ee76
child 52252 de9486d74a74
equal deleted inserted replaced
50145:752645a158ff 50146:0bb0e464ee76
       
     1 /*
       
     2  *
       
     3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  *
       
     9  *   - Redistributions of source code must retain the above copyright
       
    10  *     notice, this list of conditions and the following disclaimer.
       
    11  *
       
    12  *   - Redistributions in binary form must reproduce the above copyright
       
    13  *     notice, this list of conditions and the following disclaimer in the
       
    14  *     documentation and/or other materials provided with the distribution.
       
    15  *
       
    16  *   - Neither the name of Oracle nor the names of its
       
    17  *     contributors may be used to endorse or promote products derived
       
    18  *     from this software without specific prior written permission.
       
    19  *
       
    20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    31  */
       
    32 package java2d;
       
    33 
       
    34 
       
    35 import static java2d.CustomControlsContext.State.START;
       
    36 import static java2d.CustomControlsContext.State.STOP;
       
    37 import static java2d.DemoImages.newDemoImages;
       
    38 import static java2d.DemoFonts.newDemoFonts;
       
    39 import static java2d.RunWindow.RunWindowSettings;
       
    40 import java.awt.BorderLayout;
       
    41 import java.awt.Color;
       
    42 import java.awt.Component;
       
    43 import java.awt.Cursor;
       
    44 import java.awt.Dimension;
       
    45 import java.awt.Font;
       
    46 import java.awt.Graphics;
       
    47 import java.awt.Graphics2D;
       
    48 import java.awt.GridBagConstraints;
       
    49 import java.awt.GridBagLayout;
       
    50 import java.awt.Insets;
       
    51 import java.awt.RenderingHints;
       
    52 import java.awt.Toolkit;
       
    53 import java.awt.event.ActionEvent;
       
    54 import java.awt.event.ActionListener;
       
    55 import java.awt.event.ItemEvent;
       
    56 import java.awt.event.ItemListener;
       
    57 import java.awt.event.WindowAdapter;
       
    58 import java.awt.event.WindowEvent;
       
    59 import java.awt.event.WindowListener;
       
    60 import java.awt.font.FontRenderContext;
       
    61 import java.awt.font.TextLayout;
       
    62 import javax.swing.Box;
       
    63 import javax.swing.BoxLayout;
       
    64 import javax.swing.Icon;
       
    65 import javax.swing.JCheckBoxMenuItem;
       
    66 import javax.swing.JColorChooser;
       
    67 import javax.swing.JFrame;
       
    68 import javax.swing.JLabel;
       
    69 import javax.swing.JMenu;
       
    70 import javax.swing.JMenuBar;
       
    71 import javax.swing.JMenuItem;
       
    72 import javax.swing.JOptionPane;
       
    73 import javax.swing.JPanel;
       
    74 import javax.swing.JPopupMenu;
       
    75 import javax.swing.JProgressBar;
       
    76 import javax.swing.JSeparator;
       
    77 import javax.swing.JTabbedPane;
       
    78 import javax.swing.SwingUtilities;
       
    79 import javax.swing.UIManager;
       
    80 import javax.swing.border.EtchedBorder;
       
    81 
       
    82 
       
    83 /**
       
    84  * A demo that shows Java 2D(TM) API features.
       
    85  */
       
    86 @SuppressWarnings("serial")
       
    87 public class J2Ddemo extends JPanel implements ItemListener, ActionListener, DemoInstVarsAccessor {
       
    88     private final GlobalControls controls;
       
    89     private final MemoryMonitor memorymonitor;
       
    90     private final PerformanceMonitor performancemonitor;
       
    91     private final JTabbedPane tabbedPane;
       
    92     private final DemoGroup[] group;
       
    93     private JCheckBoxMenuItem verboseCB;
       
    94     private JCheckBoxMenuItem ccthreadCB;
       
    95     private JCheckBoxMenuItem printCB = new JCheckBoxMenuItem("Default Printer");
       
    96     private Color backgroundColor;
       
    97     private JCheckBoxMenuItem memoryCB, perfCB;
       
    98     private final Intro intro;
       
    99     public static final String[][] demos = {
       
   100         { "Arcs_Curves", "Arcs", "BezierAnim", "Curves", "Ellipses" },
       
   101         { "Clipping", "Areas", "ClipAnim", "Intersection", "Text" },
       
   102         { "Colors", "BullsEye", "ColorConvert", "Rotator3D" },
       
   103         { "Composite", "ACimages", "ACrules", "FadeAnim" },
       
   104         { "Fonts", "AttributedStr", "Highlighting", "Outline", "Tree" },
       
   105         { "Images", "DukeAnim", "ImageOps", "JPEGFlip", "WarpImage" },
       
   106         { "Lines", "Caps", "Dash", "Joins", "LineAnim" },
       
   107         { "Mix", "Balls", "BezierScroller", "Stars3D" },
       
   108         { "Paint", "GradAnim", "Gradient", "Texture", "TextureAnim" },
       
   109         { "Paths", "Append", "CurveQuadTo", "FillStroke", "WindingRule" },
       
   110         { "Transforms", "Rotate", "SelectTx", "TransformAnim" }
       
   111     };
       
   112     private final boolean demoIsInApplet;
       
   113     private JCheckBoxMenuItem controlsCB;
       
   114     private JMenuItem runMI, cloneMI, fileMI, backgMI;
       
   115 //    private JMenuItem ccthreadMI, verboseMI;
       
   116     private RunWindow runwindow;
       
   117     private RunWindowSettings runWndSetts;
       
   118     private CloningFeature cloningfeature;
       
   119     private JFrame rf, cf;
       
   120 //    private GlobalPanel gp;
       
   121 
       
   122     /**
       
   123      * Construct the J2D Demo.
       
   124      */
       
   125     public J2Ddemo(boolean demoIsInApplet, DemoProgress progress, RunWindowSettings runWndSetts) {
       
   126         this.demoIsInApplet = demoIsInApplet;
       
   127         this.runWndSetts = runWndSetts;
       
   128 
       
   129         setLayout(new BorderLayout());
       
   130         setBorder(new EtchedBorder());
       
   131 
       
   132         add(createMenuBar(), BorderLayout.NORTH);
       
   133 
       
   134         // hard coding 14 = 11 demo dirs + images + fonts + Intro
       
   135         progress.setMaximum(13);
       
   136         progress.setText("Loading images");
       
   137         newDemoImages();
       
   138         progress.setValue(progress.getValue() + 1);
       
   139         progress.setText("Loading fonts");
       
   140         newDemoFonts();
       
   141         progress.setValue(progress.getValue() + 1);
       
   142         progress.setText("Loading Intro");
       
   143         intro = new Intro();
       
   144         progress.setValue(progress.getValue() + 1);
       
   145         UIManager.put("Button.margin", new Insets(0, 0, 0, 0));
       
   146 
       
   147         controls = new GlobalControls(this);
       
   148         memorymonitor = new MemoryMonitor();
       
   149         performancemonitor = new PerformanceMonitor();
       
   150 
       
   151         GlobalPanel gp = new GlobalPanel(this);
       
   152 
       
   153         tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
       
   154         tabbedPane.setFont(new Font(Font.SERIF, Font.PLAIN, 12));
       
   155         tabbedPane.addTab("", new J2DIcon(this), gp);
       
   156         tabbedPane.addChangeListener(gp);
       
   157 
       
   158         group = new DemoGroup[demos.length];
       
   159         for (int i = 0; i < demos.length; i++) {
       
   160             progress.setText("Loading demos." + demos[i][0]);
       
   161             group[i] = new DemoGroup(demos[i][0], this);
       
   162             tabbedPane.addTab(demos[i][0], null);
       
   163             progress.setValue(progress.getValue() + 1);
       
   164         }
       
   165 
       
   166         add(tabbedPane, BorderLayout.CENTER);
       
   167     }
       
   168 
       
   169     private JMenuBar createMenuBar() {
       
   170 
       
   171         JPopupMenu.setDefaultLightWeightPopupEnabled(false);
       
   172         JMenuBar menuBar = new JMenuBar();
       
   173 
       
   174         if (!demoIsInApplet) {
       
   175             JMenu file = menuBar.add(new JMenu("File"));
       
   176             fileMI = file.add(new JMenuItem("Exit"));
       
   177             fileMI.addActionListener(this);
       
   178         }
       
   179 
       
   180         JMenu options = menuBar.add(new JMenu("Options"));
       
   181 
       
   182         controlsCB = (JCheckBoxMenuItem) options.add(
       
   183                 new JCheckBoxMenuItem("Global Controls", true));
       
   184         controlsCB.addItemListener(this);
       
   185 
       
   186         memoryCB = (JCheckBoxMenuItem) options.add(
       
   187                 new JCheckBoxMenuItem("Memory Monitor", true));
       
   188         memoryCB.addItemListener(this);
       
   189 
       
   190         perfCB = (JCheckBoxMenuItem) options.add(
       
   191                 new JCheckBoxMenuItem("Performance Monitor", true));
       
   192         perfCB.addItemListener(this);
       
   193 
       
   194         options.add(new JSeparator());
       
   195 
       
   196         ccthreadCB = (JCheckBoxMenuItem) options.add(
       
   197                 new JCheckBoxMenuItem("Custom Controls Thread"));
       
   198         ccthreadCB.addItemListener(this);
       
   199 
       
   200         printCB = (JCheckBoxMenuItem) options.add(printCB);
       
   201 
       
   202         verboseCB = (JCheckBoxMenuItem) options.add(
       
   203                 new JCheckBoxMenuItem("Verbose"));
       
   204 
       
   205         options.add(new JSeparator());
       
   206 
       
   207         backgMI = options.add(new JMenuItem("Background Color"));
       
   208         backgMI.addActionListener(this);
       
   209 
       
   210         runMI = options.add(new JMenuItem("Run Window"));
       
   211         runMI.addActionListener(this);
       
   212 
       
   213         cloneMI = options.add(new JMenuItem("Cloning Feature"));
       
   214         cloneMI.addActionListener(this);
       
   215 
       
   216         return menuBar;
       
   217     }
       
   218 
       
   219     public void createRunWindow() {
       
   220         if (rf != null) {
       
   221             rf.toFront();
       
   222             return;
       
   223         }
       
   224         runwindow = new RunWindow(this, runWndSetts);
       
   225         WindowListener l = new WindowAdapter() {
       
   226 
       
   227             @Override
       
   228             public void windowClosing(WindowEvent e) {
       
   229                 runwindow.stop();
       
   230                 rf.dispose();
       
   231             }
       
   232 
       
   233             @Override
       
   234             public void windowClosed(WindowEvent e) {
       
   235                 rf = null;
       
   236             }
       
   237         };
       
   238         rf = new JFrame("Run");
       
   239         rf.addWindowListener(l);
       
   240         rf.getContentPane().add("Center", runwindow);
       
   241         rf.pack();
       
   242         if (!demoIsInApplet) {
       
   243             rf.setSize(new Dimension(200, 125));
       
   244         } else {
       
   245             rf.setSize(new Dimension(200, 150));
       
   246         }
       
   247         rf.setVisible(true);
       
   248     }
       
   249 
       
   250     public void startRunWindow() {
       
   251         SwingUtilities.invokeLater(new Runnable() {
       
   252 
       
   253             @Override
       
   254             public void run() {
       
   255                 runwindow.doRunAction();
       
   256             }
       
   257         });
       
   258     }
       
   259 
       
   260     @Override
       
   261     public void actionPerformed(ActionEvent e) {
       
   262         if (e.getSource().equals(fileMI)) {
       
   263             System.exit(0);
       
   264         } else if (e.getSource().equals(runMI)) {
       
   265             createRunWindow();
       
   266         } else if (e.getSource().equals(cloneMI)) {
       
   267             if (cloningfeature == null) {
       
   268                 cloningfeature = new CloningFeature(this);
       
   269                 WindowListener l = new WindowAdapter() {
       
   270 
       
   271                     @Override
       
   272                     public void windowClosing(WindowEvent e) {
       
   273                         cloningfeature.stop();
       
   274                         cf.dispose();
       
   275                     }
       
   276 
       
   277                     @Override
       
   278                     public void windowClosed(WindowEvent e) {
       
   279                         cloningfeature = null;
       
   280                     }
       
   281                 };
       
   282                 cf = new JFrame("Cloning Demo");
       
   283                 cf.addWindowListener(l);
       
   284                 cf.getContentPane().add("Center", cloningfeature);
       
   285                 cf.pack();
       
   286                 cf.setSize(new Dimension(320, 330));
       
   287                 cf.setVisible(true);
       
   288             } else {
       
   289                 cf.toFront();
       
   290             }
       
   291         } else if (e.getSource().equals(backgMI)) {
       
   292             backgroundColor =
       
   293                     JColorChooser.showDialog(this, "Background Color",
       
   294                     Color.white);
       
   295             for (int i = 1; i < tabbedPane.getTabCount(); i++) {
       
   296                 JPanel p = group[i - 1].getPanel();
       
   297                 for (int j = 0; j < p.getComponentCount(); j++) {
       
   298                     DemoPanel dp = (DemoPanel) p.getComponent(j);
       
   299                     if (dp.surface != null) {
       
   300                         dp.surface.setBackground(backgroundColor);
       
   301                     }
       
   302                 }
       
   303             }
       
   304         }
       
   305     }
       
   306 
       
   307     @Override
       
   308     public void itemStateChanged(ItemEvent e) {
       
   309         if (e.getSource().equals(controlsCB)) {
       
   310             boolean newVisibility = !controls.isVisible();
       
   311             controls.setVisible(newVisibility);
       
   312             for (Component cmp : controls.texturechooser.getComponents()) {
       
   313                 cmp.setVisible(newVisibility);
       
   314             }
       
   315         } else if (e.getSource().equals(memoryCB)) {
       
   316             if (memorymonitor.isVisible()) {
       
   317                 memorymonitor.setVisible(false);
       
   318                 memorymonitor.surf.setVisible(false);
       
   319                 memorymonitor.surf.stop();
       
   320             } else {
       
   321                 memorymonitor.setVisible(true);
       
   322                 memorymonitor.surf.setVisible(true);
       
   323                 memorymonitor.surf.start();
       
   324             }
       
   325         } else if (e.getSource().equals(perfCB)) {
       
   326             if (performancemonitor.isVisible()) {
       
   327                 performancemonitor.setVisible(false);
       
   328                 performancemonitor.surf.setVisible(false);
       
   329                 performancemonitor.surf.stop();
       
   330             } else {
       
   331                 performancemonitor.setVisible(true);
       
   332                 performancemonitor.surf.setVisible(true);
       
   333                 performancemonitor.surf.start();
       
   334             }
       
   335         } else if (e.getSource().equals(ccthreadCB)) {
       
   336             CustomControlsContext.State state =
       
   337                     ccthreadCB.isSelected() ? START : STOP;
       
   338             if (tabbedPane.getSelectedIndex() != 0) {
       
   339                 JPanel p = group[tabbedPane.getSelectedIndex() - 1].getPanel();
       
   340                 for (int i = 0; i < p.getComponentCount(); i++) {
       
   341                     DemoPanel dp = (DemoPanel) p.getComponent(i);
       
   342                     if (dp.ccc != null) {
       
   343                         dp.ccc.handleThread(state);
       
   344                     }
       
   345                 }
       
   346             }
       
   347         }
       
   348         revalidate();
       
   349     }
       
   350 
       
   351     public void start() {
       
   352         if (tabbedPane.getSelectedIndex() == 0) {
       
   353             intro.start();
       
   354         } else {
       
   355             group[tabbedPane.getSelectedIndex() - 1].setup(false);
       
   356             if (memorymonitor.surf.thread == null && memoryCB.getState()) {
       
   357                 memorymonitor.surf.start();
       
   358             }
       
   359             if (performancemonitor.surf.thread == null && perfCB.getState()) {
       
   360                 performancemonitor.surf.start();
       
   361             }
       
   362         }
       
   363     }
       
   364 
       
   365     public void stop() {
       
   366         if (tabbedPane.getSelectedIndex() == 0) {
       
   367             intro.stop();
       
   368         } else {
       
   369             memorymonitor.surf.stop();
       
   370             performancemonitor.surf.stop();
       
   371             int i = tabbedPane.getSelectedIndex() - 1;
       
   372             group[i].shutDown(group[i].getPanel());
       
   373         }
       
   374     }
       
   375 
       
   376     /**
       
   377      * Start of 'DemoInstVarsAccessor' implementation.
       
   378      */
       
   379     @Override
       
   380     public GlobalControls getControls() {
       
   381         return controls;
       
   382     }
       
   383 
       
   384     @Override
       
   385     public MemoryMonitor getMemoryMonitor() {
       
   386         return memorymonitor;
       
   387     }
       
   388 
       
   389     @Override
       
   390     public PerformanceMonitor getPerformanceMonitor() {
       
   391         return performancemonitor;
       
   392     }
       
   393 
       
   394     @Override
       
   395     public JTabbedPane getTabbedPane() {
       
   396         return tabbedPane;
       
   397     }
       
   398 
       
   399     @Override
       
   400     public DemoGroup[] getGroup() {
       
   401         return group;
       
   402     }
       
   403 
       
   404     @Override
       
   405     public void setGroupColumns(int columns) {
       
   406         for (DemoGroup dg : group) {
       
   407             if (dg != null) {
       
   408                 dg.columns = columns;
       
   409             }
       
   410         }
       
   411     }
       
   412 
       
   413     @Override
       
   414     public JCheckBoxMenuItem getVerboseCB() {
       
   415         return verboseCB;
       
   416     }
       
   417 
       
   418     @Override
       
   419     public JCheckBoxMenuItem getCcthreadCB() {
       
   420         return ccthreadCB;
       
   421     }
       
   422 
       
   423     @Override
       
   424     public JCheckBoxMenuItem getPrintCB() {
       
   425         return printCB;
       
   426     }
       
   427 
       
   428     @Override
       
   429     public Color getBackgroundColor() {
       
   430         return backgroundColor;
       
   431     }
       
   432 
       
   433     @Override
       
   434     public JCheckBoxMenuItem getMemoryCB() {
       
   435         return memoryCB;
       
   436     }
       
   437 
       
   438     @Override
       
   439     public JCheckBoxMenuItem getPerfCB() {
       
   440         return perfCB;
       
   441     }
       
   442 
       
   443     @Override
       
   444     public Intro getIntro() {
       
   445         return intro;
       
   446     }
       
   447     /**
       
   448      * End of 'DemoInstVarsAccessor' implementation.
       
   449      */
       
   450 
       
   451     static void addToGridBag(JPanel panel, Component comp,
       
   452             int x, int y, int w, int h, double weightx, double weighty) {
       
   453 
       
   454         GridBagLayout gbl = (GridBagLayout) panel.getLayout();
       
   455         GridBagConstraints c = new GridBagConstraints();
       
   456         c.fill = GridBagConstraints.BOTH;
       
   457         c.gridx = x;
       
   458         c.gridy = y;
       
   459         c.gridwidth = w;
       
   460         c.gridheight = h;
       
   461         c.weightx = weightx;
       
   462         c.weighty = weighty;
       
   463         panel.add(comp);
       
   464         gbl.setConstraints(comp, c);
       
   465     }
       
   466 
       
   467 
       
   468     /**
       
   469      * The Icon for the Intro tab.
       
   470      */
       
   471     static class J2DIcon implements Icon {
       
   472         private final DemoInstVarsAccessor demoInstVars;
       
   473         private static final Color myBlue = new Color(94, 105, 176);
       
   474         private static final Color myBlack = new Color(20, 20, 20);
       
   475         private static final Font font = new Font(Font.SERIF, Font.BOLD, 12);
       
   476         private FontRenderContext frc = new FontRenderContext(null, true, true);
       
   477         private TextLayout tl = new TextLayout("J2D demo", font, frc);
       
   478 
       
   479         public J2DIcon(DemoInstVarsAccessor demoInstVars) {
       
   480             this.demoInstVars = demoInstVars;
       
   481         }
       
   482 
       
   483         @Override
       
   484         public void paintIcon(Component c, Graphics g, int x, int y) {
       
   485             Graphics2D g2 = (Graphics2D) g;
       
   486             g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
       
   487                     RenderingHints.VALUE_ANTIALIAS_ON);
       
   488             g2.setFont(font);
       
   489             if (demoInstVars.getTabbedPane().getSelectedIndex() == 0) {
       
   490                 g2.setColor(myBlue);
       
   491             } else {
       
   492                 g2.setColor(myBlack);
       
   493             }
       
   494             tl.draw(g2, x, y + (float)(tl.getBounds().getHeight()));
       
   495         }
       
   496 
       
   497         @Override
       
   498         public int getIconWidth() {
       
   499             return (int)(tl.getAdvance())+5;
       
   500         }
       
   501 
       
   502         @Override
       
   503         public int getIconHeight() {
       
   504             return (int)(tl.getBounds().getHeight());
       
   505         }
       
   506     }
       
   507 
       
   508     /**
       
   509      * This class eliminates the need in presence of static 'JLabel', 'JProgressBar'
       
   510      * variables in 'J2Ddemo' class. It is a part of the fix which changed static
       
   511      * variables for instance variables in certain demo classes.
       
   512      */
       
   513     public static class DemoProgress {
       
   514         private final JLabel progressLabel;
       
   515         private final JProgressBar progressBar;
       
   516 
       
   517         public DemoProgress(JLabel progressLabel, JProgressBar progressBar) {
       
   518             if (progressLabel == null) {
       
   519                 throw new IllegalArgumentException("null was transferred as 'progressLabel' argument");
       
   520             }
       
   521             if (progressBar == null) {
       
   522                 throw new IllegalArgumentException("null was transferred as 'progressBar' argument");
       
   523             }
       
   524 
       
   525             this.progressLabel = progressLabel;
       
   526             this.progressBar = progressBar;
       
   527         }
       
   528 
       
   529         public void setText(String text) {
       
   530             progressLabel.setText(text);
       
   531         }
       
   532 
       
   533         public void setMaximum(int n) {
       
   534             progressBar.setMaximum(n);
       
   535         }
       
   536 
       
   537         public int getValue() {
       
   538             return progressBar.getValue();
       
   539         }
       
   540 
       
   541         public void setValue(int n) {
       
   542             progressBar.setValue(n);
       
   543         }
       
   544     }
       
   545 
       
   546     private static void initFrame(String[] args, RunWindowSettings runWndSetts) {
       
   547         final J2Ddemo[] demoOneInstArr = new J2Ddemo[1];
       
   548 
       
   549         JFrame frame = new JFrame("Java 2D(TM) Demo");
       
   550         frame.getAccessibleContext().setAccessibleDescription(
       
   551                 "A sample application to demonstrate Java2D(TM) features");
       
   552         int FRAME_WIDTH = 400, FRAME_HEIGHT = 200;
       
   553         frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
       
   554         Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
       
   555         frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT
       
   556                 / 2);
       
   557         frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
       
   558         frame.addWindowListener(new WindowAdapter() {
       
   559 
       
   560             @Override
       
   561             public void windowClosing(WindowEvent e) {
       
   562                 System.exit(0);
       
   563             }
       
   564 
       
   565             @Override
       
   566             public void windowDeiconified(WindowEvent e) {
       
   567                 J2Ddemo demo = demoOneInstArr[0];
       
   568                 if (demo != null) {
       
   569                     demo.start();
       
   570                 }
       
   571             }
       
   572 
       
   573             @Override
       
   574             public void windowIconified(WindowEvent e) {
       
   575                 J2Ddemo demo = demoOneInstArr[0];
       
   576                 if (demo != null) {
       
   577                     demo.stop();
       
   578                 }
       
   579             }
       
   580         });
       
   581         JOptionPane.setRootFrame(frame);
       
   582 
       
   583         JPanel progressPanel = new JPanel() {
       
   584 
       
   585             @Override
       
   586             public Insets getInsets() {
       
   587                 return new Insets(40, 30, 20, 30);
       
   588             }
       
   589         };
       
   590         progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS));
       
   591         frame.getContentPane().add(progressPanel, BorderLayout.CENTER);
       
   592 
       
   593         Dimension labelSize = new Dimension(400, 20);
       
   594         JLabel progressLabel = new JLabel("Loading, please wait...");
       
   595         progressLabel.setAlignmentX(CENTER_ALIGNMENT);
       
   596         progressLabel.setMaximumSize(labelSize);
       
   597         progressLabel.setPreferredSize(labelSize);
       
   598         progressPanel.add(progressLabel);
       
   599         progressPanel.add(Box.createRigidArea(new Dimension(1, 20)));
       
   600 
       
   601         JProgressBar progressBar = new JProgressBar();
       
   602         progressBar.setStringPainted(true);
       
   603         progressLabel.setLabelFor(progressBar);
       
   604         progressBar.setAlignmentX(CENTER_ALIGNMENT);
       
   605         progressBar.setMinimum(0);
       
   606         progressBar.setValue(0);
       
   607         progressBar.getAccessibleContext().setAccessibleName(
       
   608                                   "J2D demo loading progress");
       
   609         progressPanel.add(progressBar);
       
   610         DemoProgress demoProgress = new DemoProgress(progressLabel, progressBar);
       
   611 
       
   612         frame.setVisible(true);
       
   613 
       
   614         J2Ddemo demo = new J2Ddemo(false, demoProgress, runWndSetts);
       
   615         demoOneInstArr[0] = demo;
       
   616 
       
   617         frame.getContentPane().removeAll();
       
   618         frame.getContentPane().setLayout(new BorderLayout());
       
   619         frame.getContentPane().add(demo, BorderLayout.CENTER);
       
   620         FRAME_WIDTH = 850;
       
   621         FRAME_HEIGHT = 600;
       
   622         frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT
       
   623                 / 2);
       
   624         frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
       
   625         frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
       
   626 
       
   627         for (int i = 0; i < args.length; i++) {
       
   628             String arg = args[i];
       
   629             String s = arg.substring(arg.indexOf('=') + 1);
       
   630             if (arg.startsWith("-runs=")) {
       
   631                 runWndSetts.setNumRuns(Integer.parseInt(s));
       
   632                 runWndSetts.setExit(true);
       
   633                 demo.createRunWindow();
       
   634             } else if (arg.startsWith("-screen=")) {
       
   635                 demo.getControls().screenCombo.setSelectedIndex(Integer.parseInt(s));
       
   636             } else if (arg.startsWith("-antialias=")) {
       
   637                 demo.controls.aliasCB.setSelected(s.endsWith("true"));
       
   638             } else if (arg.startsWith("-rendering=")) {
       
   639                 demo.controls.renderCB.setSelected(s.endsWith("true"));
       
   640             } else if (arg.startsWith("-texture=")) {
       
   641                 demo.controls.textureCB.setSelected(s.endsWith("true"));
       
   642             } else if (arg.startsWith("-composite=")) {
       
   643                 demo.controls.compositeCB.setSelected(s.endsWith("true"));
       
   644             } else if (arg.startsWith("-verbose")) {
       
   645                 demo.verboseCB.setSelected(true);
       
   646             } else if (arg.startsWith("-print")) {
       
   647                 demo.printCB.setSelected(true);
       
   648                 runWndSetts.setPrintCBIsSelected(true);
       
   649             } else if (arg.startsWith("-columns=")) {
       
   650                 demo.setGroupColumns(Integer.parseInt(s));
       
   651             } else if (arg.startsWith("-buffers=")) {
       
   652                 // usage -buffers=3,10
       
   653                 runWndSetts.setBuffersFlag(true);
       
   654                 int i1 = arg.indexOf('=') + 1;
       
   655                 int i2 = arg.indexOf(',');
       
   656                 String s1 = arg.substring(i1, i2);
       
   657                 runWndSetts.setBufBeg(Integer.parseInt(s1));
       
   658                 s1 = arg.substring(i2 + 1, arg.length());
       
   659                 runWndSetts.setBufEnd(Integer.parseInt(s1));
       
   660             } else if (arg.startsWith("-ccthread")) {
       
   661                 demo.ccthreadCB.setSelected(true);
       
   662             } else if (arg.startsWith("-zoom")) {
       
   663                 runWndSetts.setZoomCBSelected(true);
       
   664             } else if (arg.startsWith("-maxscreen")) {
       
   665                 frame.setLocation(0, 0);
       
   666                 frame.setSize(d.width, d.height);
       
   667             }
       
   668         }
       
   669 
       
   670         frame.validate();
       
   671         frame.repaint();
       
   672         frame.getFocusTraversalPolicy().getDefaultComponent(frame).requestFocus();
       
   673         demo.start();
       
   674 
       
   675         if (runWndSetts.getExit()) {
       
   676             demo.startRunWindow();
       
   677         }
       
   678 
       
   679     }
       
   680 
       
   681     public static void main(final String args[]) {
       
   682         SwingUtilities.invokeLater(new Runnable() {
       
   683             @Override
       
   684             public void run() {
       
   685                 RunWindowSettings runWndSetts = new RunWindowSettings();
       
   686                 for (int i = 0; i < args.length; i++) {
       
   687                     if (args[i].startsWith("-h") || args[i].startsWith("-help")) {
       
   688                         String s = "\njava -jar J2Ddemo.jar -runs=5 -delay=5 -screen=5 "
       
   689                                 + "-antialias=true -rendering=true -texture=true "
       
   690                                 + "-composite=true -verbose -print -columns=3 "
       
   691                                 + "-buffers=5,10 -ccthread -zoom -maxscreen \n";
       
   692                         System.out.println(s);
       
   693                         s =
       
   694                                 "    -runs=5       Number of runs to execute\n"
       
   695                                 + "    -delay=5      Sleep amount between tabs\n"
       
   696                                 + "    -antialias=   true or false for antialiasing\n"
       
   697                                 + "    -rendering=   true or false for quality or speed\n"
       
   698                                 + "    -texture=     true or false for texturing\n"
       
   699                                 + "    -composite=   true or false for compositing\n"
       
   700                                 + "    -verbose      output Surface graphic states \n"
       
   701                                 + "    -print        during run print the Surface, "
       
   702                                 + "use the Default Printer\n"
       
   703                                 + "    -columns=3    # of columns to use in clone layout \n"
       
   704                                 + "    -screen=3     demos all use this screen type \n"
       
   705                                 + "    -buffers=5,10 during run - clone to see screens "
       
   706                                 + "five through ten\n"
       
   707                                 + "    -ccthread     Invoke the Custom Controls Thread \n"
       
   708                                 + "    -zoom         mouseClick on surface for zoom in  \n"
       
   709                                 + "    -maxscreen    take up the entire monitor screen \n";
       
   710                         System.out.println(s);
       
   711                         s =
       
   712                                 "Examples : \n" + "    Print all of the demos : \n"
       
   713                                 + "        java -jar J2Ddemo.jar -runs=1 -delay=60 -print \n"
       
   714                                 + "    Run zoomed in with custom control thread \n"
       
   715                                 + "        java -jar J2Ddemo.jar -runs=10 -zoom -ccthread\n";
       
   716                         System.out.println(s);
       
   717                         System.exit(0);
       
   718                     } else if (args[i].startsWith("-delay=")) {
       
   719                         String s = args[i].substring(args[i].indexOf('=') + 1);
       
   720                         runWndSetts.setDelay(Integer.parseInt(s));
       
   721                     }
       
   722                 }
       
   723 
       
   724                 initFrame(args, runWndSetts);
       
   725             }
       
   726         });
       
   727     }
       
   728 }