/* * * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package java2d; import static java2d.CustomControlsContext.State.START; import static java2d.CustomControlsContext.State.STOP; import static java2d.DemoImages.newDemoImages; import static java2d.DemoFonts.newDemoFonts; import static java2d.RunWindow.RunWindowSettings; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JCheckBoxMenuItem; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; import javax.swing.JSeparator; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.EtchedBorder; /** * A demo that shows Java 2D(TM) API features. */ @SuppressWarnings("serial") public class J2Ddemo extends JPanel implements ItemListener, ActionListener, DemoInstVarsAccessor { private final GlobalControls controls; private final MemoryMonitor memorymonitor; private final PerformanceMonitor performancemonitor; private final JTabbedPane tabbedPane; private final DemoGroup[] group; private JCheckBoxMenuItem verboseCB; private JCheckBoxMenuItem ccthreadCB; private JCheckBoxMenuItem printCB = new JCheckBoxMenuItem("Default Printer"); private Color backgroundColor; private JCheckBoxMenuItem memoryCB, perfCB; private final Intro intro; public static final String[][] demos = { { "Arcs_Curves", "Arcs", "BezierAnim", "Curves", "Ellipses" }, { "Clipping", "Areas", "ClipAnim", "Intersection", "Text" }, { "Colors", "BullsEye", "ColorConvert", "Rotator3D" }, { "Composite", "ACimages", "ACrules", "FadeAnim" }, { "Fonts", "AttributedStr", "Highlighting", "Outline", "Tree" }, { "Images", "DukeAnim", "ImageOps", "JPEGFlip", "WarpImage" }, { "Lines", "Caps", "Dash", "Joins", "LineAnim" }, { "Mix", "Balls", "BezierScroller", "Stars3D" }, { "Paint", "GradAnim", "Gradient", "Texture", "TextureAnim" }, { "Paths", "Append", "CurveQuadTo", "FillStroke", "WindingRule" }, { "Transforms", "Rotate", "SelectTx", "TransformAnim" } }; private final boolean demoIsInApplet; private JCheckBoxMenuItem controlsCB; private JMenuItem runMI, cloneMI, fileMI, backgMI; // private JMenuItem ccthreadMI, verboseMI; private RunWindow runwindow; private RunWindowSettings runWndSetts; private CloningFeature cloningfeature; private JFrame rf, cf; // private GlobalPanel gp; /** * Construct the J2D Demo. */ public J2Ddemo(boolean demoIsInApplet, DemoProgress progress, RunWindowSettings runWndSetts) { this.demoIsInApplet = demoIsInApplet; this.runWndSetts = runWndSetts; setLayout(new BorderLayout()); setBorder(new EtchedBorder()); add(createMenuBar(), BorderLayout.NORTH); // hard coding 14 = 11 demo dirs + images + fonts + Intro progress.setMaximum(13); progress.setText("Loading images"); newDemoImages(); progress.setValue(progress.getValue() + 1); progress.setText("Loading fonts"); newDemoFonts(); progress.setValue(progress.getValue() + 1); progress.setText("Loading Intro"); intro = new Intro(); progress.setValue(progress.getValue() + 1); UIManager.put("Button.margin", new Insets(0, 0, 0, 0)); controls = new GlobalControls(this); memorymonitor = new MemoryMonitor(); performancemonitor = new PerformanceMonitor(); GlobalPanel gp = new GlobalPanel(this); tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT); tabbedPane.setFont(new Font(Font.SERIF, Font.PLAIN, 12)); tabbedPane.addTab("", new J2DIcon(this), gp); tabbedPane.addChangeListener(gp); group = new DemoGroup[demos.length]; for (int i = 0; i < demos.length; i++) { progress.setText("Loading demos." + demos[i][0]); group[i] = new DemoGroup(demos[i][0], this); tabbedPane.addTab(demos[i][0], null); progress.setValue(progress.getValue() + 1); } add(tabbedPane, BorderLayout.CENTER); } private JMenuBar createMenuBar() { JPopupMenu.setDefaultLightWeightPopupEnabled(false); JMenuBar menuBar = new JMenuBar(); if (!demoIsInApplet) { JMenu file = menuBar.add(new JMenu("File")); fileMI = file.add(new JMenuItem("Exit")); fileMI.addActionListener(this); } JMenu options = menuBar.add(new JMenu("Options")); controlsCB = (JCheckBoxMenuItem) options.add( new JCheckBoxMenuItem("Global Controls", true)); controlsCB.addItemListener(this); memoryCB = (JCheckBoxMenuItem) options.add( new JCheckBoxMenuItem("Memory Monitor", true)); memoryCB.addItemListener(this); perfCB = (JCheckBoxMenuItem) options.add( new JCheckBoxMenuItem("Performance Monitor", true)); perfCB.addItemListener(this); options.add(new JSeparator()); ccthreadCB = (JCheckBoxMenuItem) options.add( new JCheckBoxMenuItem("Custom Controls Thread")); ccthreadCB.addItemListener(this); printCB = (JCheckBoxMenuItem) options.add(printCB); verboseCB = (JCheckBoxMenuItem) options.add( new JCheckBoxMenuItem("Verbose")); options.add(new JSeparator()); backgMI = options.add(new JMenuItem("Background Color")); backgMI.addActionListener(this); runMI = options.add(new JMenuItem("Run Window")); runMI.addActionListener(this); cloneMI = options.add(new JMenuItem("Cloning Feature")); cloneMI.addActionListener(this); return menuBar; } public void createRunWindow() { if (rf != null) { rf.toFront(); return; } runwindow = new RunWindow(this, runWndSetts); WindowListener l = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { runwindow.stop(); rf.dispose(); } @Override public void windowClosed(WindowEvent e) { rf = null; } }; rf = new JFrame("Run"); rf.addWindowListener(l); rf.getContentPane().add("Center", runwindow); rf.pack(); if (!demoIsInApplet) { rf.setSize(new Dimension(200, 125)); } else { rf.setSize(new Dimension(200, 150)); } rf.setVisible(true); } public void startRunWindow() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { runwindow.doRunAction(); } }); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource().equals(fileMI)) { System.exit(0); } else if (e.getSource().equals(runMI)) { createRunWindow(); } else if (e.getSource().equals(cloneMI)) { if (cloningfeature == null) { cloningfeature = new CloningFeature(this); WindowListener l = new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { cloningfeature.stop(); cf.dispose(); } @Override public void windowClosed(WindowEvent e) { cloningfeature = null; } }; cf = new JFrame("Cloning Demo"); cf.addWindowListener(l); cf.getContentPane().add("Center", cloningfeature); cf.pack(); cf.setSize(new Dimension(320, 330)); cf.setVisible(true); } else { cf.toFront(); } } else if (e.getSource().equals(backgMI)) { backgroundColor = JColorChooser.showDialog(this, "Background Color", Color.white); for (int i = 1; i < tabbedPane.getTabCount(); i++) { JPanel p = group[i - 1].getPanel(); for (int j = 0; j < p.getComponentCount(); j++) { DemoPanel dp = (DemoPanel) p.getComponent(j); if (dp.surface != null) { dp.surface.setBackground(backgroundColor); } } } } } @Override public void itemStateChanged(ItemEvent e) { if (e.getSource().equals(controlsCB)) { boolean newVisibility = !controls.isVisible(); controls.setVisible(newVisibility); for (Component cmp : controls.texturechooser.getComponents()) { cmp.setVisible(newVisibility); } } else if (e.getSource().equals(memoryCB)) { if (memorymonitor.isVisible()) { memorymonitor.setVisible(false); memorymonitor.surf.setVisible(false); memorymonitor.surf.stop(); } else { memorymonitor.setVisible(true); memorymonitor.surf.setVisible(true); memorymonitor.surf.start(); } } else if (e.getSource().equals(perfCB)) { if (performancemonitor.isVisible()) { performancemonitor.setVisible(false); performancemonitor.surf.setVisible(false); performancemonitor.surf.stop(); } else { performancemonitor.setVisible(true); performancemonitor.surf.setVisible(true); performancemonitor.surf.start(); } } else if (e.getSource().equals(ccthreadCB)) { CustomControlsContext.State state = ccthreadCB.isSelected() ? START : STOP; if (tabbedPane.getSelectedIndex() != 0) { JPanel p = group[tabbedPane.getSelectedIndex() - 1].getPanel(); for (int i = 0; i < p.getComponentCount(); i++) { DemoPanel dp = (DemoPanel) p.getComponent(i); if (dp.ccc != null) { dp.ccc.handleThread(state); } } } } revalidate(); } public void start() { if (tabbedPane.getSelectedIndex() == 0) { intro.start(); } else { group[tabbedPane.getSelectedIndex() - 1].setup(false); if (memorymonitor.surf.thread == null && memoryCB.getState()) { memorymonitor.surf.start(); } if (performancemonitor.surf.thread == null && perfCB.getState()) { performancemonitor.surf.start(); } } } public void stop() { if (tabbedPane.getSelectedIndex() == 0) { intro.stop(); } else { memorymonitor.surf.stop(); performancemonitor.surf.stop(); int i = tabbedPane.getSelectedIndex() - 1; group[i].shutDown(group[i].getPanel()); } } /** * Start of 'DemoInstVarsAccessor' implementation. */ @Override public GlobalControls getControls() { return controls; } @Override public MemoryMonitor getMemoryMonitor() { return memorymonitor; } @Override public PerformanceMonitor getPerformanceMonitor() { return performancemonitor; } @Override public JTabbedPane getTabbedPane() { return tabbedPane; } @Override public DemoGroup[] getGroup() { return group; } @Override public void setGroupColumns(int columns) { for (DemoGroup dg : group) { if (dg != null) { dg.columns = columns; } } } @Override public JCheckBoxMenuItem getVerboseCB() { return verboseCB; } @Override public JCheckBoxMenuItem getCcthreadCB() { return ccthreadCB; } @Override public JCheckBoxMenuItem getPrintCB() { return printCB; } @Override public Color getBackgroundColor() { return backgroundColor; } @Override public JCheckBoxMenuItem getMemoryCB() { return memoryCB; } @Override public JCheckBoxMenuItem getPerfCB() { return perfCB; } @Override public Intro getIntro() { return intro; } /** * End of 'DemoInstVarsAccessor' implementation. */ static void addToGridBag(JPanel panel, Component comp, int x, int y, int w, int h, double weightx, double weighty) { GridBagLayout gbl = (GridBagLayout) panel.getLayout(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx = x; c.gridy = y; c.gridwidth = w; c.gridheight = h; c.weightx = weightx; c.weighty = weighty; panel.add(comp); gbl.setConstraints(comp, c); } /** * The Icon for the Intro tab. */ static class J2DIcon implements Icon { private final DemoInstVarsAccessor demoInstVars; private static final Color myBlue = new Color(94, 105, 176); private static final Color myBlack = new Color(20, 20, 20); private static final Font font = new Font(Font.SERIF, Font.BOLD, 12); private FontRenderContext frc = new FontRenderContext(null, true, true); private TextLayout tl = new TextLayout("J2D demo", font, frc); public J2DIcon(DemoInstVarsAccessor demoInstVars) { this.demoInstVars = demoInstVars; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setFont(font); if (demoInstVars.getTabbedPane().getSelectedIndex() == 0) { g2.setColor(myBlue); } else { g2.setColor(myBlack); } tl.draw(g2, x, y + (float)(tl.getBounds().getHeight())); } @Override public int getIconWidth() { return (int)(tl.getAdvance())+5; } @Override public int getIconHeight() { return (int)(tl.getBounds().getHeight()); } } /** * This class eliminates the need in presence of static 'JLabel', 'JProgressBar' * variables in 'J2Ddemo' class. It is a part of the fix which changed static * variables for instance variables in certain demo classes. */ public static class DemoProgress { private final JLabel progressLabel; private final JProgressBar progressBar; public DemoProgress(JLabel progressLabel, JProgressBar progressBar) { if (progressLabel == null) { throw new IllegalArgumentException("null was transferred as 'progressLabel' argument"); } if (progressBar == null) { throw new IllegalArgumentException("null was transferred as 'progressBar' argument"); } this.progressLabel = progressLabel; this.progressBar = progressBar; } public void setText(String text) { progressLabel.setText(text); } public void setMaximum(int n) { progressBar.setMaximum(n); } public int getValue() { return progressBar.getValue(); } public void setValue(int n) { progressBar.setValue(n); } } private static void initFrame(String[] args, RunWindowSettings runWndSetts) { final J2Ddemo[] demoOneInstArr = new J2Ddemo[1]; JFrame frame = new JFrame("Java 2D(TM) Demo"); frame.getAccessibleContext().setAccessibleDescription( "A sample application to demonstrate Java2D(TM) features"); int FRAME_WIDTH = 400, FRAME_HEIGHT = 200; frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT / 2); frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } @Override public void windowDeiconified(WindowEvent e) { J2Ddemo demo = demoOneInstArr[0]; if (demo != null) { demo.start(); } } @Override public void windowIconified(WindowEvent e) { J2Ddemo demo = demoOneInstArr[0]; if (demo != null) { demo.stop(); } } }); JOptionPane.setRootFrame(frame); JPanel progressPanel = new JPanel() { @Override public Insets getInsets() { return new Insets(40, 30, 20, 30); } }; progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS)); frame.getContentPane().add(progressPanel, BorderLayout.CENTER); Dimension labelSize = new Dimension(400, 20); JLabel progressLabel = new JLabel("Loading, please wait..."); progressLabel.setAlignmentX(CENTER_ALIGNMENT); progressLabel.setMaximumSize(labelSize); progressLabel.setPreferredSize(labelSize); progressPanel.add(progressLabel); progressPanel.add(Box.createRigidArea(new Dimension(1, 20))); JProgressBar progressBar = new JProgressBar(); progressBar.setStringPainted(true); progressLabel.setLabelFor(progressBar); progressBar.setAlignmentX(CENTER_ALIGNMENT); progressBar.setMinimum(0); progressBar.setValue(0); progressBar.getAccessibleContext().setAccessibleName( "J2D demo loading progress"); progressPanel.add(progressBar); DemoProgress demoProgress = new DemoProgress(progressLabel, progressBar); frame.setVisible(true); J2Ddemo demo = new J2Ddemo(false, demoProgress, runWndSetts); demoOneInstArr[0] = demo; frame.getContentPane().removeAll(); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(demo, BorderLayout.CENTER); FRAME_WIDTH = 850; FRAME_HEIGHT = 600; frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT / 2); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); for (int i = 0; i < args.length; i++) { String arg = args[i]; String s = arg.substring(arg.indexOf('=') + 1); if (arg.startsWith("-runs=")) { runWndSetts.setNumRuns(Integer.parseInt(s)); runWndSetts.setExit(true); demo.createRunWindow(); } else if (arg.startsWith("-screen=")) { demo.getControls().screenCombo.setSelectedIndex(Integer.parseInt(s)); } else if (arg.startsWith("-antialias=")) { demo.controls.aliasCB.setSelected(s.endsWith("true")); } else if (arg.startsWith("-rendering=")) { demo.controls.renderCB.setSelected(s.endsWith("true")); } else if (arg.startsWith("-texture=")) { demo.controls.textureCB.setSelected(s.endsWith("true")); } else if (arg.startsWith("-composite=")) { demo.controls.compositeCB.setSelected(s.endsWith("true")); } else if (arg.startsWith("-verbose")) { demo.verboseCB.setSelected(true); } else if (arg.startsWith("-print")) { demo.printCB.setSelected(true); runWndSetts.setPrintCBIsSelected(true); } else if (arg.startsWith("-columns=")) { demo.setGroupColumns(Integer.parseInt(s)); } else if (arg.startsWith("-buffers=")) { // usage -buffers=3,10 runWndSetts.setBuffersFlag(true); int i1 = arg.indexOf('=') + 1; int i2 = arg.indexOf(','); String s1 = arg.substring(i1, i2); runWndSetts.setBufBeg(Integer.parseInt(s1)); s1 = arg.substring(i2 + 1, arg.length()); runWndSetts.setBufEnd(Integer.parseInt(s1)); } else if (arg.startsWith("-ccthread")) { demo.ccthreadCB.setSelected(true); } else if (arg.startsWith("-zoom")) { runWndSetts.setZoomCBSelected(true); } else if (arg.startsWith("-maxscreen")) { frame.setLocation(0, 0); frame.setSize(d.width, d.height); } } frame.validate(); frame.repaint(); frame.getFocusTraversalPolicy().getDefaultComponent(frame).requestFocus(); demo.start(); if (runWndSetts.getExit()) { demo.startRunWindow(); } } public static void main(final String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { RunWindowSettings runWndSetts = new RunWindowSettings(); for (int i = 0; i < args.length; i++) { if (args[i].startsWith("-h") || args[i].startsWith("-help")) { String s = "\njava -jar J2Ddemo.jar -runs=5 -delay=5 -screen=5 " + "-antialias=true -rendering=true -texture=true " + "-composite=true -verbose -print -columns=3 " + "-buffers=5,10 -ccthread -zoom -maxscreen \n"; System.out.println(s); s = " -runs=5 Number of runs to execute\n" + " -delay=5 Sleep amount between tabs\n" + " -antialias= true or false for antialiasing\n" + " -rendering= true or false for quality or speed\n" + " -texture= true or false for texturing\n" + " -composite= true or false for compositing\n" + " -verbose output Surface graphic states \n" + " -print during run print the Surface, " + "use the Default Printer\n" + " -columns=3 # of columns to use in clone layout \n" + " -screen=3 demos all use this screen type \n" + " -buffers=5,10 during run - clone to see screens " + "five through ten\n" + " -ccthread Invoke the Custom Controls Thread \n" + " -zoom mouseClick on surface for zoom in \n" + " -maxscreen take up the entire monitor screen \n"; System.out.println(s); s = "Examples : \n" + " Print all of the demos : \n" + " java -jar J2Ddemo.jar -runs=1 -delay=60 -print \n" + " Run zoomed in with custom control thread \n" + " java -jar J2Ddemo.jar -runs=10 -zoom -ccthread\n"; System.out.println(s); System.exit(0); } else if (args[i].startsWith("-delay=")) { String s = args[i].substring(args[i].indexOf('=') + 1); runWndSetts.setDelay(Integer.parseInt(s)); } } initFrame(args, runWndSetts); } }); } }