/* * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.swingset3.demos.spinner; import javax.swing.*; import java.awt.*; import java.awt.geom.Point2D; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import com.sun.swingset3.demos.ResourceManager; /** * @author Mikhail Lapshin */ public class MandelbrotControl extends JPanel { private final JMandelbrot mandelbrot; private JSpinner iterSpinner; private CoordSpinner xSpinner; private CoordSpinner ySpinner; private static final double COORD_SPINNER_STEP = 0.1d; // part of width or height private final ResourceManager resourceManager; public MandelbrotControl(JMandelbrot mandelbrot, ResourceManager resourceManager) { this.mandelbrot = mandelbrot; this.resourceManager = resourceManager; createUI(); installListeners(); } private void createUI() { setLayout(new FlowLayout(FlowLayout.LEADING, 5, 0)); setBorder(BorderFactory.createTitledBorder( resourceManager.getString("SpinnerDemo.fractalControls"))); JSpinnerPanel spinnerPanel = new JSpinnerPanel(); //<snip>Create spinner iterSpinner = new JSpinner(new SpinnerNumberModel( mandelbrot.getMaxIteration(), 10, 100000, 50)); //</snip> //<snip>Add change listener using anonymus inner class iterSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { mandelbrot.setMaxIteration((Integer) iterSpinner.getValue()); mandelbrot.calculatePicture(); } }); //</snip> spinnerPanel.addSpinner( resourceManager.getString("SpinnerDemo.iterations"), iterSpinner); //<snip>Create spinner final double xValue = mandelbrot.getCenter().getX(); double width = mandelbrot.getXHighLimit() - mandelbrot.getXLowLimit(); xSpinner = new CoordSpinner(xValue, width * COORD_SPINNER_STEP); //</snip> //<snip>Add change listener using anonymus inner class xSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { Double newX = (Double) xSpinner.getValue(); mandelbrot.setCenter(new Point2D.Double( newX, mandelbrot.getCenter().getY())); mandelbrot.calculatePicture(); } }); //</snip> spinnerPanel.addSpinner( resourceManager.getString("SpinnerDemo.x"), xSpinner); //<snip>Create spinner final double yValue = mandelbrot.getCenter().getY(); double height = mandelbrot.getYHighLimit() - mandelbrot.getYLowLimit(); ySpinner = new CoordSpinner(yValue, height * COORD_SPINNER_STEP); //</snip> //<snip>Add change listener using anonymus inner class ySpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { Double newY = (Double) ySpinner.getValue(); mandelbrot.setCenter(new Point2D.Double( mandelbrot.getCenter().getX(), newY)); mandelbrot.calculatePicture(); } }); //</snip> spinnerPanel.addSpinner( resourceManager.getString("SpinnerDemo.y"), ySpinner); add(spinnerPanel); } private void installListeners() { mandelbrot.addPropertyChangeListener( JMandelbrot.CENTER_PROPERTY_NAME, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { double width = mandelbrot.getXHighLimit() - mandelbrot.getXLowLimit(); double newX = mandelbrot.getCenter().getX(); xSpinner.updateModel(newX, width * COORD_SPINNER_STEP); double height = mandelbrot.getYHighLimit() - mandelbrot.getYLowLimit(); double newY = mandelbrot.getCenter().getY(); ySpinner.updateModel(newY, height * COORD_SPINNER_STEP); } } ); } //<snip>Customized spinner class // It uses special format for NumberEditor and has constant preferred width private static class CoordSpinner extends JSpinner { @Override protected JComponent createEditor(SpinnerModel model) { return new NumberEditor(this, "#.####################"); } public CoordSpinner(double value, double stepSize) { super(new SpinnerNumberModel(value, -100, 100, stepSize)); } //A useful shortcut method public void updateModel(double value, double stepSize) { SpinnerNumberModel model = (SpinnerNumberModel) getModel(); model.setValue(value); model.setStepSize(stepSize); } @Override public Dimension getPreferredSize() { Dimension prefSize = super.getPreferredSize(); prefSize.setSize(180, prefSize.getHeight()); return prefSize; } } //</snip> }