Path: blob/master/src/demo/share/jfc/J2Ddemo/java2d/J2Ddemo.java
41154 views
/*1*2* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7*8* - Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10*11* - Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* - Neither the name of Oracle nor the names of its16* contributors may be used to endorse or promote products derived17* from this software without specific prior written permission.18*19* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS20* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,21* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR22* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR23* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,24* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,25* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR26* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF27* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING28* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/31package java2d;323334import static java2d.CustomControlsContext.State.START;35import static java2d.CustomControlsContext.State.STOP;36import static java2d.DemoImages.newDemoImages;37import static java2d.DemoFonts.newDemoFonts;38import static java2d.RunWindow.RunWindowSettings;39import java.awt.BorderLayout;40import java.awt.Color;41import java.awt.Component;42import java.awt.Cursor;43import java.awt.Dimension;44import java.awt.Font;45import java.awt.Graphics;46import java.awt.Graphics2D;47import java.awt.GridBagConstraints;48import java.awt.GridBagLayout;49import java.awt.Insets;50import java.awt.RenderingHints;51import java.awt.Toolkit;52import java.awt.event.ActionEvent;53import java.awt.event.ActionListener;54import java.awt.event.ItemEvent;55import java.awt.event.ItemListener;56import java.awt.event.WindowAdapter;57import java.awt.event.WindowEvent;58import java.awt.event.WindowListener;59import java.awt.font.FontRenderContext;60import java.awt.font.TextLayout;61import javax.swing.Box;62import javax.swing.BoxLayout;63import javax.swing.Icon;64import javax.swing.JCheckBoxMenuItem;65import javax.swing.JColorChooser;66import javax.swing.JFrame;67import javax.swing.JLabel;68import javax.swing.JMenu;69import javax.swing.JMenuBar;70import javax.swing.JMenuItem;71import javax.swing.JOptionPane;72import javax.swing.JPanel;73import javax.swing.JPopupMenu;74import javax.swing.JProgressBar;75import javax.swing.JSeparator;76import javax.swing.JTabbedPane;77import javax.swing.SwingUtilities;78import javax.swing.UIManager;79import javax.swing.border.EtchedBorder;808182/**83* A demo that shows Java 2D(TM) API features.84*/85@SuppressWarnings("serial")86public class J2Ddemo extends JPanel implements ItemListener, ActionListener, DemoInstVarsAccessor {87private final GlobalControls controls;88private final MemoryMonitor memorymonitor;89private final PerformanceMonitor performancemonitor;90private final JTabbedPane tabbedPane;91private final DemoGroup[] group;92private JCheckBoxMenuItem verboseCB;93private JCheckBoxMenuItem ccthreadCB;94private JCheckBoxMenuItem printCB = new JCheckBoxMenuItem("Default Printer");95private Color backgroundColor;96private JCheckBoxMenuItem memoryCB, perfCB;97private final Intro intro;98public static final String[][] demos = {99{ "Arcs_Curves", "Arcs", "BezierAnim", "Curves", "Ellipses" },100{ "Clipping", "Areas", "ClipAnim", "Intersection", "Text" },101{ "Colors", "BullsEye", "ColorConvert", "Rotator3D" },102{ "Composite", "ACimages", "ACrules", "FadeAnim" },103{ "Fonts", "AttributedStr", "Highlighting", "Outline", "Tree" },104{ "Images", "DukeAnim", "ImageOps", "JPEGFlip", "WarpImage" },105{ "Lines", "Caps", "Dash", "Joins", "LineAnim" },106{ "Mix", "Balls", "BezierScroller", "Stars3D" },107{ "Paint", "GradAnim", "Gradient", "Texture", "TextureAnim" },108{ "Paths", "Append", "CurveQuadTo", "FillStroke", "WindingRule" },109{ "Transforms", "Rotate", "SelectTx", "TransformAnim" }110};111private final boolean demoIsInApplet;112private JCheckBoxMenuItem controlsCB;113private JMenuItem runMI, cloneMI, fileMI, backgMI;114// private JMenuItem ccthreadMI, verboseMI;115private RunWindow runwindow;116private RunWindowSettings runWndSetts;117private CloningFeature cloningfeature;118private JFrame rf, cf;119// private GlobalPanel gp;120121/**122* Construct the J2D Demo.123*/124public J2Ddemo(boolean demoIsInApplet, DemoProgress progress, RunWindowSettings runWndSetts) {125this.demoIsInApplet = demoIsInApplet;126this.runWndSetts = runWndSetts;127128setLayout(new BorderLayout());129setBorder(new EtchedBorder());130131add(createMenuBar(), BorderLayout.NORTH);132133// hard coding 14 = 11 demo dirs + images + fonts + Intro134progress.setMaximum(13);135progress.setText("Loading images");136newDemoImages();137progress.setValue(progress.getValue() + 1);138progress.setText("Loading fonts");139newDemoFonts();140progress.setValue(progress.getValue() + 1);141progress.setText("Loading Intro");142intro = new Intro();143progress.setValue(progress.getValue() + 1);144UIManager.put("Button.margin", new Insets(0, 0, 0, 0));145146controls = new GlobalControls(this);147memorymonitor = new MemoryMonitor();148performancemonitor = new PerformanceMonitor();149150GlobalPanel gp = new GlobalPanel(this);151152tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);153tabbedPane.setFont(new Font(Font.SERIF, Font.PLAIN, 12));154tabbedPane.addTab("", new J2DIcon(this), gp);155tabbedPane.addChangeListener(gp);156157group = new DemoGroup[demos.length];158for (int i = 0; i < demos.length; i++) {159progress.setText("Loading demos." + demos[i][0]);160group[i] = new DemoGroup(demos[i][0], this);161tabbedPane.addTab(demos[i][0], null);162progress.setValue(progress.getValue() + 1);163}164165add(tabbedPane, BorderLayout.CENTER);166}167168private JMenuBar createMenuBar() {169170JPopupMenu.setDefaultLightWeightPopupEnabled(false);171JMenuBar menuBar = new JMenuBar();172173if (!demoIsInApplet) {174JMenu file = menuBar.add(new JMenu("File"));175fileMI = file.add(new JMenuItem("Exit"));176fileMI.addActionListener(this);177}178179JMenu options = menuBar.add(new JMenu("Options"));180181controlsCB = (JCheckBoxMenuItem) options.add(182new JCheckBoxMenuItem("Global Controls", true));183controlsCB.addItemListener(this);184185memoryCB = (JCheckBoxMenuItem) options.add(186new JCheckBoxMenuItem("Memory Monitor", true));187memoryCB.addItemListener(this);188189perfCB = (JCheckBoxMenuItem) options.add(190new JCheckBoxMenuItem("Performance Monitor", true));191perfCB.addItemListener(this);192193options.add(new JSeparator());194195ccthreadCB = (JCheckBoxMenuItem) options.add(196new JCheckBoxMenuItem("Custom Controls Thread"));197ccthreadCB.addItemListener(this);198199printCB = (JCheckBoxMenuItem) options.add(printCB);200201verboseCB = (JCheckBoxMenuItem) options.add(202new JCheckBoxMenuItem("Verbose"));203204options.add(new JSeparator());205206backgMI = options.add(new JMenuItem("Background Color"));207backgMI.addActionListener(this);208209runMI = options.add(new JMenuItem("Run Window"));210runMI.addActionListener(this);211212cloneMI = options.add(new JMenuItem("Cloning Feature"));213cloneMI.addActionListener(this);214215return menuBar;216}217218public void createRunWindow() {219if (rf != null) {220rf.toFront();221return;222}223runwindow = new RunWindow(this, runWndSetts);224WindowListener l = new WindowAdapter() {225226@Override227public void windowClosing(WindowEvent e) {228runwindow.stop();229rf.dispose();230}231232@Override233public void windowClosed(WindowEvent e) {234rf = null;235}236};237rf = new JFrame("Run");238rf.addWindowListener(l);239rf.getContentPane().add("Center", runwindow);240rf.pack();241if (!demoIsInApplet) {242rf.setSize(new Dimension(200, 125));243} else {244rf.setSize(new Dimension(200, 150));245}246rf.setVisible(true);247}248249public void startRunWindow() {250SwingUtilities.invokeLater(new Runnable() {251252@Override253public void run() {254runwindow.doRunAction();255}256});257}258259@Override260public void actionPerformed(ActionEvent e) {261if (e.getSource().equals(fileMI)) {262System.exit(0);263} else if (e.getSource().equals(runMI)) {264createRunWindow();265} else if (e.getSource().equals(cloneMI)) {266if (cloningfeature == null) {267cloningfeature = new CloningFeature(this);268WindowListener l = new WindowAdapter() {269270@Override271public void windowClosing(WindowEvent e) {272cloningfeature.stop();273cf.dispose();274}275276@Override277public void windowClosed(WindowEvent e) {278cloningfeature = null;279}280};281cf = new JFrame("Cloning Demo");282cf.addWindowListener(l);283cf.getContentPane().add("Center", cloningfeature);284cf.pack();285cf.setSize(new Dimension(320, 330));286cf.setVisible(true);287} else {288cf.toFront();289}290} else if (e.getSource().equals(backgMI)) {291backgroundColor =292JColorChooser.showDialog(this, "Background Color",293Color.white);294for (int i = 1; i < tabbedPane.getTabCount(); i++) {295JPanel p = group[i - 1].getPanel();296for (int j = 0; j < p.getComponentCount(); j++) {297DemoPanel dp = (DemoPanel) p.getComponent(j);298if (dp.surface != null) {299dp.surface.setBackground(backgroundColor);300}301}302}303}304}305306@Override307public void itemStateChanged(ItemEvent e) {308if (e.getSource().equals(controlsCB)) {309boolean newVisibility = !controls.isVisible();310controls.setVisible(newVisibility);311for (Component cmp : controls.texturechooser.getComponents()) {312cmp.setVisible(newVisibility);313}314} else if (e.getSource().equals(memoryCB)) {315if (memorymonitor.isVisible()) {316memorymonitor.setVisible(false);317memorymonitor.surf.setVisible(false);318memorymonitor.surf.stop();319} else {320memorymonitor.setVisible(true);321memorymonitor.surf.setVisible(true);322memorymonitor.surf.start();323}324} else if (e.getSource().equals(perfCB)) {325if (performancemonitor.isVisible()) {326performancemonitor.setVisible(false);327performancemonitor.surf.setVisible(false);328performancemonitor.surf.stop();329} else {330performancemonitor.setVisible(true);331performancemonitor.surf.setVisible(true);332performancemonitor.surf.start();333}334} else if (e.getSource().equals(ccthreadCB)) {335CustomControlsContext.State state =336ccthreadCB.isSelected() ? START : STOP;337if (tabbedPane.getSelectedIndex() != 0) {338JPanel p = group[tabbedPane.getSelectedIndex() - 1].getPanel();339for (int i = 0; i < p.getComponentCount(); i++) {340DemoPanel dp = (DemoPanel) p.getComponent(i);341if (dp.ccc != null) {342dp.ccc.handleThread(state);343}344}345}346}347revalidate();348}349350public void start() {351if (tabbedPane.getSelectedIndex() == 0) {352intro.start();353} else {354group[tabbedPane.getSelectedIndex() - 1].setup(false);355if (memorymonitor.surf.thread == null && memoryCB.getState()) {356memorymonitor.surf.start();357}358if (performancemonitor.surf.thread == null && perfCB.getState()) {359performancemonitor.surf.start();360}361}362}363364public void stop() {365if (tabbedPane.getSelectedIndex() == 0) {366intro.stop();367} else {368memorymonitor.surf.stop();369performancemonitor.surf.stop();370int i = tabbedPane.getSelectedIndex() - 1;371group[i].shutDown(group[i].getPanel());372}373}374375/**376* Start of 'DemoInstVarsAccessor' implementation.377*/378@Override379public GlobalControls getControls() {380return controls;381}382383@Override384public MemoryMonitor getMemoryMonitor() {385return memorymonitor;386}387388@Override389public PerformanceMonitor getPerformanceMonitor() {390return performancemonitor;391}392393@Override394public JTabbedPane getTabbedPane() {395return tabbedPane;396}397398@Override399public DemoGroup[] getGroup() {400return group;401}402403@Override404public void setGroupColumns(int columns) {405for (DemoGroup dg : group) {406if (dg != null) {407dg.columns = columns;408}409}410}411412@Override413public JCheckBoxMenuItem getVerboseCB() {414return verboseCB;415}416417@Override418public JCheckBoxMenuItem getCcthreadCB() {419return ccthreadCB;420}421422@Override423public JCheckBoxMenuItem getPrintCB() {424return printCB;425}426427@Override428public Color getBackgroundColor() {429return backgroundColor;430}431432@Override433public JCheckBoxMenuItem getMemoryCB() {434return memoryCB;435}436437@Override438public JCheckBoxMenuItem getPerfCB() {439return perfCB;440}441442@Override443public Intro getIntro() {444return intro;445}446/**447* End of 'DemoInstVarsAccessor' implementation.448*/449450static void addToGridBag(JPanel panel, Component comp,451int x, int y, int w, int h, double weightx, double weighty) {452453GridBagLayout gbl = (GridBagLayout) panel.getLayout();454GridBagConstraints c = new GridBagConstraints();455c.fill = GridBagConstraints.BOTH;456c.gridx = x;457c.gridy = y;458c.gridwidth = w;459c.gridheight = h;460c.weightx = weightx;461c.weighty = weighty;462panel.add(comp);463gbl.setConstraints(comp, c);464}465466467/**468* The Icon for the Intro tab.469*/470static class J2DIcon implements Icon {471private final DemoInstVarsAccessor demoInstVars;472private static final Color myBlue = new Color(94, 105, 176);473private static final Color myBlack = new Color(20, 20, 20);474private static final Font font = new Font(Font.SERIF, Font.BOLD, 12);475private FontRenderContext frc = new FontRenderContext(null, true, true);476private TextLayout tl = new TextLayout("J2D demo", font, frc);477478public J2DIcon(DemoInstVarsAccessor demoInstVars) {479this.demoInstVars = demoInstVars;480}481482@Override483public void paintIcon(Component c, Graphics g, int x, int y) {484Graphics2D g2 = (Graphics2D) g;485g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,486RenderingHints.VALUE_ANTIALIAS_ON);487g2.setFont(font);488if (demoInstVars.getTabbedPane().getSelectedIndex() == 0) {489g2.setColor(myBlue);490} else {491g2.setColor(myBlack);492}493tl.draw(g2, x, y + (float)(tl.getBounds().getHeight()));494}495496@Override497public int getIconWidth() {498return (int)(tl.getAdvance())+5;499}500501@Override502public int getIconHeight() {503return (int)(tl.getBounds().getHeight());504}505}506507/**508* This class eliminates the need in presence of static 'JLabel', 'JProgressBar'509* variables in 'J2Ddemo' class. It is a part of the fix which changed static510* variables for instance variables in certain demo classes.511*/512public static class DemoProgress {513private final JLabel progressLabel;514private final JProgressBar progressBar;515516public DemoProgress(JLabel progressLabel, JProgressBar progressBar) {517if (progressLabel == null) {518throw new IllegalArgumentException("null was transferred as 'progressLabel' argument");519}520if (progressBar == null) {521throw new IllegalArgumentException("null was transferred as 'progressBar' argument");522}523524this.progressLabel = progressLabel;525this.progressBar = progressBar;526}527528public void setText(String text) {529progressLabel.setText(text);530}531532public void setMaximum(int n) {533progressBar.setMaximum(n);534}535536public int getValue() {537return progressBar.getValue();538}539540public void setValue(int n) {541progressBar.setValue(n);542}543}544545private static void initFrame(String[] args, RunWindowSettings runWndSetts) {546final J2Ddemo[] demoOneInstArr = new J2Ddemo[1];547548JFrame frame = new JFrame("Java 2D(TM) Demo");549frame.getAccessibleContext().setAccessibleDescription(550"A sample application to demonstrate Java2D(TM) features");551int FRAME_WIDTH = 400, FRAME_HEIGHT = 200;552frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);553Dimension d = Toolkit.getDefaultToolkit().getScreenSize();554frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT555/ 2);556frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));557frame.addWindowListener(new WindowAdapter() {558559@Override560public void windowClosing(WindowEvent e) {561System.exit(0);562}563564@Override565public void windowDeiconified(WindowEvent e) {566J2Ddemo demo = demoOneInstArr[0];567if (demo != null) {568demo.start();569}570}571572@Override573public void windowIconified(WindowEvent e) {574J2Ddemo demo = demoOneInstArr[0];575if (demo != null) {576demo.stop();577}578}579});580JOptionPane.setRootFrame(frame);581582JPanel progressPanel = new JPanel() {583584@Override585public Insets getInsets() {586return new Insets(40, 30, 20, 30);587}588};589progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS));590frame.getContentPane().add(progressPanel, BorderLayout.CENTER);591592Dimension labelSize = new Dimension(400, 20);593JLabel progressLabel = new JLabel("Loading, please wait...");594progressLabel.setAlignmentX(CENTER_ALIGNMENT);595progressLabel.setMaximumSize(labelSize);596progressLabel.setPreferredSize(labelSize);597progressPanel.add(progressLabel);598progressPanel.add(Box.createRigidArea(new Dimension(1, 20)));599600JProgressBar progressBar = new JProgressBar();601progressBar.setStringPainted(true);602progressLabel.setLabelFor(progressBar);603progressBar.setAlignmentX(CENTER_ALIGNMENT);604progressBar.setMinimum(0);605progressBar.setValue(0);606progressBar.getAccessibleContext().setAccessibleName(607"J2D demo loading progress");608progressPanel.add(progressBar);609DemoProgress demoProgress = new DemoProgress(progressLabel, progressBar);610611frame.setVisible(true);612613J2Ddemo demo = new J2Ddemo(false, demoProgress, runWndSetts);614demoOneInstArr[0] = demo;615616frame.getContentPane().removeAll();617frame.getContentPane().setLayout(new BorderLayout());618frame.getContentPane().add(demo, BorderLayout.CENTER);619FRAME_WIDTH = 850;620FRAME_HEIGHT = 600;621frame.setLocation(d.width / 2 - FRAME_WIDTH / 2, d.height / 2 - FRAME_HEIGHT622/ 2);623frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);624frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));625626for (int i = 0; i < args.length; i++) {627String arg = args[i];628String s = arg.substring(arg.indexOf('=') + 1);629if (arg.startsWith("-runs=")) {630runWndSetts.setNumRuns(Integer.parseInt(s));631runWndSetts.setExit(true);632demo.createRunWindow();633} else if (arg.startsWith("-screen=")) {634demo.getControls().screenCombo.setSelectedIndex(Integer.parseInt(s));635} else if (arg.startsWith("-antialias=")) {636demo.controls.aliasCB.setSelected(s.endsWith("true"));637} else if (arg.startsWith("-rendering=")) {638demo.controls.renderCB.setSelected(s.endsWith("true"));639} else if (arg.startsWith("-texture=")) {640demo.controls.textureCB.setSelected(s.endsWith("true"));641} else if (arg.startsWith("-composite=")) {642demo.controls.compositeCB.setSelected(s.endsWith("true"));643} else if (arg.startsWith("-verbose")) {644demo.verboseCB.setSelected(true);645} else if (arg.startsWith("-print")) {646demo.printCB.setSelected(true);647runWndSetts.setPrintCBIsSelected(true);648} else if (arg.startsWith("-columns=")) {649demo.setGroupColumns(Integer.parseInt(s));650} else if (arg.startsWith("-buffers=")) {651// usage -buffers=3,10652runWndSetts.setBuffersFlag(true);653int i1 = arg.indexOf('=') + 1;654int i2 = arg.indexOf(',');655String s1 = arg.substring(i1, i2);656runWndSetts.setBufBeg(Integer.parseInt(s1));657s1 = arg.substring(i2 + 1, arg.length());658runWndSetts.setBufEnd(Integer.parseInt(s1));659} else if (arg.startsWith("-ccthread")) {660demo.ccthreadCB.setSelected(true);661} else if (arg.startsWith("-zoom")) {662runWndSetts.setZoomCBSelected(true);663} else if (arg.startsWith("-maxscreen")) {664frame.setLocation(0, 0);665frame.setSize(d.width, d.height);666}667}668669frame.validate();670frame.repaint();671frame.getFocusTraversalPolicy().getDefaultComponent(frame).requestFocus();672demo.start();673674if (runWndSetts.getExit()) {675demo.startRunWindow();676}677678}679680public static void main(final String[] args) {681SwingUtilities.invokeLater(new Runnable() {682@Override683public void run() {684RunWindowSettings runWndSetts = new RunWindowSettings();685for (int i = 0; i < args.length; i++) {686if (args[i].startsWith("-h") || args[i].startsWith("-help")) {687String s = "\njava -jar J2Ddemo.jar -runs=5 -delay=5 -screen=5 "688+ "-antialias=true -rendering=true -texture=true "689+ "-composite=true -verbose -print -columns=3 "690+ "-buffers=5,10 -ccthread -zoom -maxscreen \n";691System.out.println(s);692s =693" -runs=5 Number of runs to execute\n"694+ " -delay=5 Sleep amount between tabs\n"695+ " -antialias= true or false for antialiasing\n"696+ " -rendering= true or false for quality or speed\n"697+ " -texture= true or false for texturing\n"698+ " -composite= true or false for compositing\n"699+ " -verbose output Surface graphic states \n"700+ " -print during run print the Surface, "701+ "use the Default Printer\n"702+ " -columns=3 # of columns to use in clone layout \n"703+ " -screen=3 demos all use this screen type \n"704+ " -buffers=5,10 during run - clone to see screens "705+ "five through ten\n"706+ " -ccthread Invoke the Custom Controls Thread \n"707+ " -zoom mouseClick on surface for zoom in \n"708+ " -maxscreen take up the entire monitor screen \n";709System.out.println(s);710s =711"Examples : \n" + " Print all of the demos : \n"712+ " java -jar J2Ddemo.jar -runs=1 -delay=60 -print \n"713+ " Run zoomed in with custom control thread \n"714+ " java -jar J2Ddemo.jar -runs=10 -zoom -ccthread\n";715System.out.println(s);716System.exit(0);717} else if (args[i].startsWith("-delay=")) {718String s = args[i].substring(args[i].indexOf('=') + 1);719runWndSetts.setDelay(Integer.parseInt(s));720}721}722723initFrame(args, runWndSetts);724}725});726}727}728729730