jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/MandelbrotControl.java
changeset 36744 a00905527ec2
equal deleted inserted replaced
36743:bdc3f1b79fb7 36744:a00905527ec2
       
     1 /*
       
     2  * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 package com.sun.swingset3.demos.spinner;
       
    24 
       
    25 import javax.swing.*;
       
    26 import java.awt.*;
       
    27 import java.awt.geom.Point2D;
       
    28 import javax.swing.event.ChangeListener;
       
    29 import javax.swing.event.ChangeEvent;
       
    30 import java.beans.PropertyChangeListener;
       
    31 import java.beans.PropertyChangeEvent;
       
    32 
       
    33 import com.sun.swingset3.demos.ResourceManager;
       
    34 
       
    35 /**
       
    36  * @author Mikhail Lapshin
       
    37  */
       
    38 public class MandelbrotControl extends JPanel {
       
    39 
       
    40     private final JMandelbrot mandelbrot;
       
    41     private JSpinner iterSpinner;
       
    42     private CoordSpinner xSpinner;
       
    43     private CoordSpinner ySpinner;
       
    44     private static final double COORD_SPINNER_STEP = 0.1d; // part of width or height
       
    45     private final ResourceManager resourceManager;
       
    46 
       
    47     public MandelbrotControl(JMandelbrot mandelbrot,
       
    48             ResourceManager resourceManager) {
       
    49         this.mandelbrot = mandelbrot;
       
    50         this.resourceManager = resourceManager;
       
    51         createUI();
       
    52         installListeners();
       
    53     }
       
    54 
       
    55     private void createUI() {
       
    56         setLayout(new FlowLayout(FlowLayout.LEADING, 5, 0));
       
    57         setBorder(BorderFactory.createTitledBorder(
       
    58                 resourceManager.getString("SpinnerDemo.fractalControls")));
       
    59         JSpinnerPanel spinnerPanel = new JSpinnerPanel();
       
    60 
       
    61         //<snip>Create spinner
       
    62         iterSpinner = new JSpinner(new SpinnerNumberModel(
       
    63                 mandelbrot.getMaxIteration(), 10, 100000, 50));
       
    64         //</snip>
       
    65         //<snip>Add change listener using anonymus inner class
       
    66         iterSpinner.addChangeListener(new ChangeListener() {
       
    67             @Override
       
    68             public void stateChanged(ChangeEvent e) {
       
    69                 mandelbrot.setMaxIteration((Integer) iterSpinner.getValue());
       
    70                 mandelbrot.calculatePicture();
       
    71             }
       
    72         });
       
    73         //</snip>
       
    74         spinnerPanel.addSpinner(
       
    75                 resourceManager.getString("SpinnerDemo.iterations"), iterSpinner);
       
    76 
       
    77         //<snip>Create spinner
       
    78         final double xValue = mandelbrot.getCenter().getX();
       
    79         double width = mandelbrot.getXHighLimit() - mandelbrot.getXLowLimit();
       
    80         xSpinner = new CoordSpinner(xValue, width * COORD_SPINNER_STEP);
       
    81         //</snip>
       
    82         //<snip>Add change listener using anonymus inner class
       
    83         xSpinner.addChangeListener(new ChangeListener() {
       
    84             @Override
       
    85             public void stateChanged(ChangeEvent e) {
       
    86                 Double newX = (Double) xSpinner.getValue();
       
    87                 mandelbrot.setCenter(new Point2D.Double(
       
    88                         newX, mandelbrot.getCenter().getY()));
       
    89                 mandelbrot.calculatePicture();
       
    90             }
       
    91         });
       
    92         //</snip>
       
    93         spinnerPanel.addSpinner(
       
    94                 resourceManager.getString("SpinnerDemo.x"), xSpinner);
       
    95 
       
    96         //<snip>Create spinner
       
    97         final double yValue = mandelbrot.getCenter().getY();
       
    98         double height = mandelbrot.getYHighLimit() - mandelbrot.getYLowLimit();
       
    99         ySpinner = new CoordSpinner(yValue, height * COORD_SPINNER_STEP);
       
   100         //</snip>
       
   101         //<snip>Add change listener using anonymus inner class
       
   102         ySpinner.addChangeListener(new ChangeListener() {
       
   103             @Override
       
   104             public void stateChanged(ChangeEvent e) {
       
   105                 Double newY = (Double) ySpinner.getValue();
       
   106                 mandelbrot.setCenter(new Point2D.Double(
       
   107                         mandelbrot.getCenter().getX(), newY));
       
   108                 mandelbrot.calculatePicture();
       
   109             }
       
   110         });
       
   111         //</snip>
       
   112         spinnerPanel.addSpinner(
       
   113                 resourceManager.getString("SpinnerDemo.y"), ySpinner);
       
   114 
       
   115         add(spinnerPanel);
       
   116     }
       
   117 
       
   118     private void installListeners() {
       
   119         mandelbrot.addPropertyChangeListener(
       
   120                 JMandelbrot.CENTER_PROPERTY_NAME,
       
   121                 new PropertyChangeListener() {
       
   122             @Override
       
   123             public void propertyChange(PropertyChangeEvent evt) {
       
   124                 double width = mandelbrot.getXHighLimit()
       
   125                         - mandelbrot.getXLowLimit();
       
   126                 double newX = mandelbrot.getCenter().getX();
       
   127                 xSpinner.updateModel(newX, width * COORD_SPINNER_STEP);
       
   128                 double height = mandelbrot.getYHighLimit()
       
   129                         - mandelbrot.getYLowLimit();
       
   130                 double newY = mandelbrot.getCenter().getY();
       
   131                 ySpinner.updateModel(newY, height * COORD_SPINNER_STEP);
       
   132             }
       
   133         }
       
   134         );
       
   135     }
       
   136 
       
   137     //<snip>Customized spinner class
       
   138     // It uses special format for NumberEditor and has constant preferred width
       
   139     private static class CoordSpinner extends JSpinner {
       
   140 
       
   141         @Override
       
   142         protected JComponent createEditor(SpinnerModel model) {
       
   143             return new NumberEditor(this, "#.####################");
       
   144         }
       
   145 
       
   146         public CoordSpinner(double value, double stepSize) {
       
   147             super(new SpinnerNumberModel(value, -100, 100, stepSize));
       
   148         }
       
   149 
       
   150         //A useful shortcut method
       
   151         public void updateModel(double value, double stepSize) {
       
   152             SpinnerNumberModel model = (SpinnerNumberModel) getModel();
       
   153             model.setValue(value);
       
   154             model.setStepSize(stepSize);
       
   155         }
       
   156 
       
   157         @Override
       
   158         public Dimension getPreferredSize() {
       
   159             Dimension prefSize = super.getPreferredSize();
       
   160             prefSize.setSize(180, prefSize.getHeight());
       
   161             return prefSize;
       
   162         }
       
   163     }
       
   164     //</snip>
       
   165 }