<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FSwing_JFC%2FBoundedRangeModel</id>
		<title>Java/Swing JFC/BoundedRangeModel - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FSwing_JFC%2FBoundedRangeModel"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Swing_JFC/BoundedRangeModel&amp;action=history"/>
		<updated>2026-04-23T02:42:47Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Swing_JFC/BoundedRangeModel&amp;diff=7467&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Swing_JFC/BoundedRangeModel&amp;diff=7467&amp;oldid=prev"/>
				<updated>2010-06-01T06:46:18Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:46, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Swing_JFC/BoundedRangeModel&amp;diff=7466&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Swing_JFC/BoundedRangeModel&amp;diff=7466&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== implements BoundedRangeModel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *     documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS&lt;br /&gt;
 * IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * A application that requires the following files:&lt;br /&gt;
 *   ConversionPanel.java&lt;br /&gt;
 *   ConverterRangeModel.java&lt;br /&gt;
 *   FollowerRangeModel.java&lt;br /&gt;
 *   Unit.java&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.beans.PropertyChangeEvent;&lt;br /&gt;
import java.beans.PropertyChangeListener;&lt;br /&gt;
import java.text.NumberFormat;&lt;br /&gt;
import javax.swing.BorderFactory;&lt;br /&gt;
import javax.swing.BoundedRangeModel;&lt;br /&gt;
import javax.swing.Box;&lt;br /&gt;
import javax.swing.BoxLayout;&lt;br /&gt;
import javax.swing.JComboBox;&lt;br /&gt;
import javax.swing.JFormattedTextField;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JSlider;&lt;br /&gt;
import javax.swing.UIManager;&lt;br /&gt;
import javax.swing.UnsupportedLookAndFeelException;&lt;br /&gt;
import javax.swing.event.ChangeEvent;&lt;br /&gt;
import javax.swing.event.ChangeListener;&lt;br /&gt;
import javax.swing.event.EventListenerList;&lt;br /&gt;
import javax.swing.text.NumberFormatter;&lt;br /&gt;
public class Converter {&lt;br /&gt;
  ConversionPanel metricPanel, usaPanel;&lt;br /&gt;
  Unit[] metricDistances = new Unit[3];&lt;br /&gt;
  Unit[] usaDistances = new Unit[4];&lt;br /&gt;
  final static boolean MULTICOLORED = false;&lt;br /&gt;
  // Specify the look and feel to use. Valid values:&lt;br /&gt;
  // null (use the default), &amp;quot;Metal&amp;quot;, &amp;quot;System&amp;quot;, &amp;quot;Motif&amp;quot;, &amp;quot;GTK+&amp;quot;&lt;br /&gt;
  final static String LOOKANDFEEL = null;&lt;br /&gt;
  ConverterRangeModel dataModel = new ConverterRangeModel();&lt;br /&gt;
  JPanel mainPane;&lt;br /&gt;
  /**&lt;br /&gt;
   * Create the ConversionPanels (one for metric, another for U.S.). I used&lt;br /&gt;
   * &amp;quot;U.S.&amp;quot; because although Imperial and U.S. distance measurements are the&lt;br /&gt;
   * same, this program could be extended to include volume measurements, which&lt;br /&gt;
   * aren&amp;quot;t the same.&lt;br /&gt;
   */&lt;br /&gt;
  public Converter() {&lt;br /&gt;
    // Create Unit objects for metric distances, and then&lt;br /&gt;
    // instantiate a ConversionPanel with these Units.&lt;br /&gt;
    metricDistances[0] = new Unit(&amp;quot;Centimeters&amp;quot;, 0.01);&lt;br /&gt;
    metricDistances[1] = new Unit(&amp;quot;Meters&amp;quot;, 1.0);&lt;br /&gt;
    metricDistances[2] = new Unit(&amp;quot;Kilometers&amp;quot;, 1000.0);&lt;br /&gt;
    metricPanel = new ConversionPanel(this, &amp;quot;Metric System&amp;quot;, metricDistances,&lt;br /&gt;
        dataModel);&lt;br /&gt;
    // Create Unit objects for U.S. distances, and then&lt;br /&gt;
    // instantiate a ConversionPanel with these Units.&lt;br /&gt;
    usaDistances[0] = new Unit(&amp;quot;Inches&amp;quot;, 0.0254);&lt;br /&gt;
    usaDistances[1] = new Unit(&amp;quot;Feet&amp;quot;, 0.305);&lt;br /&gt;
    usaDistances[2] = new Unit(&amp;quot;Yards&amp;quot;, 0.914);&lt;br /&gt;
    usaDistances[3] = new Unit(&amp;quot;Miles&amp;quot;, 1613.0);&lt;br /&gt;
    usaPanel = new ConversionPanel(this, &amp;quot;U.S. System&amp;quot;, usaDistances,&lt;br /&gt;
        new FollowerRangeModel(dataModel));&lt;br /&gt;
    // Create a JPanel, and add the ConversionPanels to it.&lt;br /&gt;
    mainPane = new JPanel();&lt;br /&gt;
    mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.PAGE_AXIS));&lt;br /&gt;
    if (MULTICOLORED) {&lt;br /&gt;
      mainPane.setOpaque(true);&lt;br /&gt;
      mainPane.setBackground(new Color(255, 0, 0));&lt;br /&gt;
    }&lt;br /&gt;
    mainPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));&lt;br /&gt;
    mainPane.add(Box.createRigidArea(new Dimension(0, 5)));&lt;br /&gt;
    mainPane.add(metricPanel);&lt;br /&gt;
    mainPane.add(Box.createRigidArea(new Dimension(0, 5)));&lt;br /&gt;
    mainPane.add(usaPanel);&lt;br /&gt;
    mainPane.add(Box.createGlue());&lt;br /&gt;
    resetMaxValues(true);&lt;br /&gt;
  }&lt;br /&gt;
  public void resetMaxValues(boolean resetCurrentValues) {&lt;br /&gt;
    double metricMultiplier = metricPanel.getMultiplier();&lt;br /&gt;
    double usaMultiplier = usaPanel.getMultiplier();&lt;br /&gt;
    int maximum = ConversionPanel.MAX;&lt;br /&gt;
    if (metricMultiplier &amp;gt; usaMultiplier) {&lt;br /&gt;
      maximum = (int) (ConversionPanel.MAX * (usaMultiplier / metricMultiplier));&lt;br /&gt;
    }&lt;br /&gt;
    dataModel.setMaximum(maximum);&lt;br /&gt;
    if (resetCurrentValues) {&lt;br /&gt;
      dataModel.setDoubleValue(maximum);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private static void initLookAndFeel() {&lt;br /&gt;
    String lookAndFeel = null;&lt;br /&gt;
    if (LOOKANDFEEL != null) {&lt;br /&gt;
      if (LOOKANDFEEL.equals(&amp;quot;Metal&amp;quot;)) {&lt;br /&gt;
        lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();&lt;br /&gt;
      } else if (LOOKANDFEEL.equals(&amp;quot;System&amp;quot;)) {&lt;br /&gt;
        lookAndFeel = UIManager.getSystemLookAndFeelClassName();&lt;br /&gt;
      } else if (LOOKANDFEEL.equals(&amp;quot;Motif&amp;quot;)) {&lt;br /&gt;
        lookAndFeel = &amp;quot;com.sun.java.swing.plaf.motif.MotifLookAndFeel&amp;quot;;&lt;br /&gt;
      } else if (LOOKANDFEEL.equals(&amp;quot;GTK+&amp;quot;)) { // new in 1.4.2&lt;br /&gt;
        lookAndFeel = &amp;quot;com.sun.java.swing.plaf.gtk.GTKLookAndFeel&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
        System.err.println(&amp;quot;Unexpected value of LOOKANDFEEL specified: &amp;quot;&lt;br /&gt;
            + LOOKANDFEEL);&lt;br /&gt;
        lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();&lt;br /&gt;
      }&lt;br /&gt;
      try {&lt;br /&gt;
        UIManager.setLookAndFeel(lookAndFeel);&lt;br /&gt;
      } catch (ClassNotFoundException e) {&lt;br /&gt;
        System.err.println(&amp;quot;Couldn&amp;quot;t find class for specified look and feel:&amp;quot;&lt;br /&gt;
            + lookAndFeel);&lt;br /&gt;
        System.err&lt;br /&gt;
            .println(&amp;quot;Did you include the L&amp;amp;F library in the class path?&amp;quot;);&lt;br /&gt;
        System.err.println(&amp;quot;Using the default look and feel.&amp;quot;);&lt;br /&gt;
      } catch (UnsupportedLookAndFeelException e) {&lt;br /&gt;
        System.err.println(&amp;quot;Can&amp;quot;t use the specified look and feel (&amp;quot;&lt;br /&gt;
            + lookAndFeel + &amp;quot;) on this platform.&amp;quot;);&lt;br /&gt;
        System.err.println(&amp;quot;Using the default look and feel.&amp;quot;);&lt;br /&gt;
      } catch (Exception e) {&lt;br /&gt;
        System.err.println(&amp;quot;Couldn&amp;quot;t get specified look and feel (&amp;quot;&lt;br /&gt;
            + lookAndFeel + &amp;quot;), for some reason.&amp;quot;);&lt;br /&gt;
        System.err.println(&amp;quot;Using the default look and feel.&amp;quot;);&lt;br /&gt;
        e.printStackTrace();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Create the GUI and show it. For thread safety, this method should be&lt;br /&gt;
   * invoked from the event-dispatching thread.&lt;br /&gt;
   */&lt;br /&gt;
  private static void createAndShowGUI() {&lt;br /&gt;
    // Set the look and feel.&lt;br /&gt;
    initLookAndFeel();&lt;br /&gt;
    // Create and set up the window.&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;Converter&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    // Create and set up the content pane.&lt;br /&gt;
    Converter converter = new Converter();&lt;br /&gt;
    converter.mainPane.setOpaque(true); // content panes must be opaque&lt;br /&gt;
    frame.setContentPane(converter.mainPane);&lt;br /&gt;
    // Display the window.&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    // Schedule a job for the event-dispatching thread:&lt;br /&gt;
    // creating and showing this application&amp;quot;s GUI.&lt;br /&gt;
    javax.swing.SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        createAndShowGUI();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 *  - Redistributions of source code must retain the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer.&lt;br /&gt;
 *  - Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
 * and/or other materials provided with the distribution.&lt;br /&gt;
 *  - Neither the name of Sun Microsystems nor the names of its contributors may&lt;br /&gt;
 * be used to endorse or promote products derived from this software without&lt;br /&gt;
 * specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE&lt;br /&gt;
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * Works in 1.1+Swing, 1.4, and all releases in between. Used by the Converter&lt;br /&gt;
 * example.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * Based on the source code for DefaultBoundedRangeModel, this class stores its&lt;br /&gt;
 * value as a double, rather than an int. The minimum value and extent are&lt;br /&gt;
 * always 0.&lt;br /&gt;
 */&lt;br /&gt;
class ConverterRangeModel implements BoundedRangeModel {&lt;br /&gt;
  protected ChangeEvent changeEvent = null;&lt;br /&gt;
  protected EventListenerList listenerList = new EventListenerList();&lt;br /&gt;
  protected int maximum = 10000;&lt;br /&gt;
  protected int minimum = 0;&lt;br /&gt;
  protected int extent = 0;&lt;br /&gt;
  protected double value = 0.0;&lt;br /&gt;
  protected double multiplier = 1.0;&lt;br /&gt;
  protected boolean isAdjusting = false;&lt;br /&gt;
  public ConverterRangeModel() {&lt;br /&gt;
  }&lt;br /&gt;
  public double getMultiplier() {&lt;br /&gt;
    return multiplier;&lt;br /&gt;
  }&lt;br /&gt;
  public void setMultiplier(double multiplier) {&lt;br /&gt;
    this.multiplier = multiplier;&lt;br /&gt;
    fireStateChanged();&lt;br /&gt;
  }&lt;br /&gt;
  public int getMaximum() {&lt;br /&gt;
    return maximum;&lt;br /&gt;
  }&lt;br /&gt;
  public void setMaximum(int newMaximum) {&lt;br /&gt;
    setRangeProperties(value, extent, minimum, newMaximum, isAdjusting);&lt;br /&gt;
  }&lt;br /&gt;
  public int getMinimum() {&lt;br /&gt;
    return (int) minimum;&lt;br /&gt;
  }&lt;br /&gt;
  public void setMinimum(int newMinimum) {&lt;br /&gt;
    System.out.println(&amp;quot;In ConverterRangeModel setMinimum&amp;quot;);&lt;br /&gt;
    // Do nothing.&lt;br /&gt;
  }&lt;br /&gt;
  public int getValue() {&lt;br /&gt;
    return (int) getDoubleValue();&lt;br /&gt;
  }&lt;br /&gt;
  public void setValue(int newValue) {&lt;br /&gt;
    setDoubleValue((double) newValue);&lt;br /&gt;
  }&lt;br /&gt;
  public double getDoubleValue() {&lt;br /&gt;
    return value;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDoubleValue(double newValue) {&lt;br /&gt;
    setRangeProperties(newValue, extent, minimum, maximum, isAdjusting);&lt;br /&gt;
  }&lt;br /&gt;
  public int getExtent() {&lt;br /&gt;
    return (int) extent;&lt;br /&gt;
  }&lt;br /&gt;
  public void setExtent(int newExtent) {&lt;br /&gt;
    // Do nothing.&lt;br /&gt;
  }&lt;br /&gt;
  public boolean getValueIsAdjusting() {&lt;br /&gt;
    return isAdjusting;&lt;br /&gt;
  }&lt;br /&gt;
  public void setValueIsAdjusting(boolean b) {&lt;br /&gt;
    setRangeProperties(value, extent, minimum, maximum, b);&lt;br /&gt;
  }&lt;br /&gt;
  public void setRangeProperties(int newValue, int newExtent, int newMin,&lt;br /&gt;
      int newMax, boolean newAdjusting) {&lt;br /&gt;
    setRangeProperties((double) newValue, newExtent, newMin, newMax,&lt;br /&gt;
        newAdjusting);&lt;br /&gt;
  }&lt;br /&gt;
  public void setRangeProperties(double newValue, int unusedExtent,&lt;br /&gt;
      int unusedMin, int newMax, boolean newAdjusting) {&lt;br /&gt;
    if (newMax &amp;lt;= minimum) {&lt;br /&gt;
      newMax = minimum + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if (Math.round(newValue) &amp;gt; newMax) { // allow some rounding error&lt;br /&gt;
      newValue = newMax;&lt;br /&gt;
    }&lt;br /&gt;
    boolean changeOccurred = false;&lt;br /&gt;
    if (newValue != value) {&lt;br /&gt;
      value = newValue;&lt;br /&gt;
      changeOccurred = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (newMax != maximum) {&lt;br /&gt;
      maximum = newMax;&lt;br /&gt;
      changeOccurred = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (newAdjusting != isAdjusting) {&lt;br /&gt;
      maximum = newMax;&lt;br /&gt;
      isAdjusting = newAdjusting;&lt;br /&gt;
      changeOccurred = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (changeOccurred) {&lt;br /&gt;
      fireStateChanged();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * The rest of this is event handling code copied from&lt;br /&gt;
   * DefaultBoundedRangeModel.&lt;br /&gt;
   */&lt;br /&gt;
  public void addChangeListener(ChangeListener l) {&lt;br /&gt;
    listenerList.add(ChangeListener.class, l);&lt;br /&gt;
  }&lt;br /&gt;
  public void removeChangeListener(ChangeListener l) {&lt;br /&gt;
    listenerList.remove(ChangeListener.class, l);&lt;br /&gt;
  }&lt;br /&gt;
  protected void fireStateChanged() {&lt;br /&gt;
    Object[] listeners = listenerList.getListenerList();&lt;br /&gt;
    for (int i = listeners.length - 2; i &amp;gt;= 0; i -= 2) {&lt;br /&gt;
      if (listeners[i] == ChangeListener.class) {&lt;br /&gt;
        if (changeEvent == null) {&lt;br /&gt;
          changeEvent = new ChangeEvent(this);&lt;br /&gt;
        }&lt;br /&gt;
        ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 *  - Redistributions of source code must retain the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer.&lt;br /&gt;
 *  - Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
 * and/or other materials provided with the distribution.&lt;br /&gt;
 *  - Neither the name of Sun Microsystems nor the names of its contributors may&lt;br /&gt;
 * be used to endorse or promote products derived from this software without&lt;br /&gt;
 * specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE&lt;br /&gt;
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * Works in 1.1+Swing, 1.4, and all releases in between. Used by the Converter&lt;br /&gt;
 * example.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * Implements a model whose data is actually in another model (the &amp;quot;source&lt;br /&gt;
 * model&amp;quot;). The follower model adjusts the values obtained from the source model&lt;br /&gt;
 * (or set in the follower model) to be in a different unit of measure.&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class FollowerRangeModel extends ConverterRangeModel implements ChangeListener {&lt;br /&gt;
  ConverterRangeModel sourceModel; // the real model&lt;br /&gt;
  /** Creates a FollowerRangeModel that gets its state from sourceModel. */&lt;br /&gt;
  public FollowerRangeModel(ConverterRangeModel sourceModel) {&lt;br /&gt;
    this.sourceModel = sourceModel;&lt;br /&gt;
    sourceModel.addChangeListener(this);&lt;br /&gt;
  }&lt;br /&gt;
  // The only method in the ChangeListener interface.&lt;br /&gt;
  public void stateChanged(ChangeEvent e) {&lt;br /&gt;
    fireStateChanged();&lt;br /&gt;
  }&lt;br /&gt;
  public int getMaximum() {&lt;br /&gt;
    int modelMax = sourceModel.getMaximum();&lt;br /&gt;
    double multiplyBy = sourceModel.getMultiplier() / this.getMultiplier();&lt;br /&gt;
    return (int) (modelMax * multiplyBy);&lt;br /&gt;
  }&lt;br /&gt;
  public void setMaximum(int newMaximum) {&lt;br /&gt;
    sourceModel&lt;br /&gt;
        .setMaximum((int) (newMaximum * (this.getMultiplier() / sourceModel&lt;br /&gt;
            .getMultiplier())));&lt;br /&gt;
  }&lt;br /&gt;
  public int getValue() {&lt;br /&gt;
    return (int) getDoubleValue();&lt;br /&gt;
  }&lt;br /&gt;
  public void setValue(int newValue) {&lt;br /&gt;
    setDoubleValue((double) newValue);&lt;br /&gt;
  }&lt;br /&gt;
  public double getDoubleValue() {&lt;br /&gt;
    return sourceModel.getDoubleValue() * sourceModel.getMultiplier()&lt;br /&gt;
        / this.getMultiplier();&lt;br /&gt;
  }&lt;br /&gt;
  public void setDoubleValue(double newValue) {&lt;br /&gt;
    sourceModel.setDoubleValue(newValue * this.getMultiplier()&lt;br /&gt;
        / sourceModel.getMultiplier());&lt;br /&gt;
  }&lt;br /&gt;
  public int getExtent() {&lt;br /&gt;
    return super.getExtent();&lt;br /&gt;
  }&lt;br /&gt;
  public void setExtent(int newExtent) {&lt;br /&gt;
    super.setExtent(newExtent);&lt;br /&gt;
  }&lt;br /&gt;
  public void setRangeProperties(int value, int extent, int min, int max,&lt;br /&gt;
      boolean adjusting) {&lt;br /&gt;
    double multiplyBy = this.getMultiplier() / sourceModel.getMultiplier();&lt;br /&gt;
    sourceModel.setRangeProperties(value * multiplyBy, extent, min,&lt;br /&gt;
        (int) (max * multiplyBy), adjusting);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 *  - Redistributions of source code must retain the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer.&lt;br /&gt;
 *  - Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
 * and/or other materials provided with the distribution.&lt;br /&gt;
 *  - Neither the name of Sun Microsystems nor the names of its contributors may&lt;br /&gt;
 * be used to endorse or promote products derived from this software without&lt;br /&gt;
 * specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE&lt;br /&gt;
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * Works in 1.1+Swing, 1.4, and all releases in between. Used by the Converter&lt;br /&gt;
 * example.&lt;br /&gt;
 */&lt;br /&gt;
class Unit {&lt;br /&gt;
  String description;&lt;br /&gt;
  double multiplier;&lt;br /&gt;
  Unit(String description, double multiplier) {&lt;br /&gt;
    super();&lt;br /&gt;
    this.description = description;&lt;br /&gt;
    this.multiplier = multiplier;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    String s = &amp;quot;Meters/&amp;quot; + description + &amp;quot; = &amp;quot; + multiplier;&lt;br /&gt;
    return s;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.&lt;br /&gt;
 * &lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 *  - Redistributions of source code must retain the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer.&lt;br /&gt;
 *  - Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
 * this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
 * and/or other materials provided with the distribution.&lt;br /&gt;
 *  - Neither the name of Sun Microsystems nor the names of its contributors may&lt;br /&gt;
 * be used to endorse or promote products derived from this software without&lt;br /&gt;
 * specific prior written permission.&lt;br /&gt;
 * &lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE&lt;br /&gt;
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * A 1.4 class used by the Converter example.&lt;br /&gt;
 */&lt;br /&gt;
class ConversionPanel extends JPanel implements ActionListener, ChangeListener,&lt;br /&gt;
    PropertyChangeListener {&lt;br /&gt;
  JFormattedTextField textField;&lt;br /&gt;
  JComboBox unitChooser;&lt;br /&gt;
  JSlider slider;&lt;br /&gt;
  ConverterRangeModel sliderModel;&lt;br /&gt;
  Converter controller;&lt;br /&gt;
  Unit[] units;&lt;br /&gt;
  String title;&lt;br /&gt;
  NumberFormat numberFormat;&lt;br /&gt;
  final static boolean MULTICOLORED = false;&lt;br /&gt;
  final static int MAX = 10000;&lt;br /&gt;
  ConversionPanel(Converter myController, String myTitle, Unit[] myUnits,&lt;br /&gt;
      ConverterRangeModel myModel) {&lt;br /&gt;
    if (MULTICOLORED) {&lt;br /&gt;
      setOpaque(true);&lt;br /&gt;
      setBackground(new Color(0, 255, 255));&lt;br /&gt;
    }&lt;br /&gt;
    setBorder(BorderFactory.createCompoundBorder(BorderFactory&lt;br /&gt;
        .createTitledBorder(myTitle), BorderFactory.createEmptyBorder(5, 5, 5,&lt;br /&gt;
        5)));&lt;br /&gt;
    // Save arguments in instance variables.&lt;br /&gt;
    controller = myController;&lt;br /&gt;
    units = myUnits;&lt;br /&gt;
    title = myTitle;&lt;br /&gt;
    sliderModel = myModel;&lt;br /&gt;
    // Create the text field format, and then the text field.&lt;br /&gt;
    numberFormat = NumberFormat.getNumberInstance();&lt;br /&gt;
    numberFormat.setMaximumFractionDigits(2);&lt;br /&gt;
    NumberFormatter formatter = new NumberFormatter(numberFormat);&lt;br /&gt;
    formatter.setAllowsInvalid(false);&lt;br /&gt;
    formatter.setCommitsOnValidEdit(true);// seems to be a no-op --&lt;br /&gt;
    // aha -- it changes the value property but doesn&amp;quot;t cause the result to&lt;br /&gt;
    // be parsed (that happens on focus loss/return, I think).&lt;br /&gt;
    //&lt;br /&gt;
    textField = new JFormattedTextField(formatter);&lt;br /&gt;
    textField.setColumns(10);&lt;br /&gt;
    textField.setValue(new Double(sliderModel.getDoubleValue()));&lt;br /&gt;
    textField.addPropertyChangeListener(this);&lt;br /&gt;
    // Add the combo box.&lt;br /&gt;
    unitChooser = new JComboBox();&lt;br /&gt;
    for (int i = 0; i &amp;lt; units.length; i++) { // Populate it.&lt;br /&gt;
      unitChooser.addItem(units[i].description);&lt;br /&gt;
    }&lt;br /&gt;
    unitChooser.setSelectedIndex(0);&lt;br /&gt;
    sliderModel.setMultiplier(units[0].multiplier);&lt;br /&gt;
    unitChooser.addActionListener(this);&lt;br /&gt;
    // Add the slider.&lt;br /&gt;
    slider = new JSlider(sliderModel);&lt;br /&gt;
    sliderModel.addChangeListener(this);&lt;br /&gt;
    // Make the text field/slider group a fixed size&lt;br /&gt;
    // to make stacked ConversionPanels nicely aligned.&lt;br /&gt;
    JPanel unitGroup = new JPanel() {&lt;br /&gt;
      public Dimension getMinimumSize() {&lt;br /&gt;
        return getPreferredSize();&lt;br /&gt;
      }&lt;br /&gt;
      public Dimension getPreferredSize() {&lt;br /&gt;
        return new Dimension(150, super.getPreferredSize().height);&lt;br /&gt;
      }&lt;br /&gt;
      public Dimension getMaximumSize() {&lt;br /&gt;
        return getPreferredSize();&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    unitGroup.setLayout(new BoxLayout(unitGroup, BoxLayout.PAGE_AXIS));&lt;br /&gt;
    if (MULTICOLORED) {&lt;br /&gt;
      unitGroup.setOpaque(true);&lt;br /&gt;
      unitGroup.setBackground(new Color(0, 0, 255));&lt;br /&gt;
    }&lt;br /&gt;
    unitGroup.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));&lt;br /&gt;
    unitGroup.add(textField);&lt;br /&gt;
    unitGroup.add(slider);&lt;br /&gt;
    // Create a subpanel so the combo box isn&amp;quot;t too tall&lt;br /&gt;
    // and is sufficiently wide.&lt;br /&gt;
    JPanel chooserPanel = new JPanel();&lt;br /&gt;
    chooserPanel.setLayout(new BoxLayout(chooserPanel, BoxLayout.PAGE_AXIS));&lt;br /&gt;
    if (MULTICOLORED) {&lt;br /&gt;
      chooserPanel.setOpaque(true);&lt;br /&gt;
      chooserPanel.setBackground(new Color(255, 0, 255));&lt;br /&gt;
    }&lt;br /&gt;
    chooserPanel.add(unitChooser);&lt;br /&gt;
    chooserPanel.add(Box.createHorizontalStrut(100));&lt;br /&gt;
    // Put everything together.&lt;br /&gt;
    setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));&lt;br /&gt;
    add(unitGroup);&lt;br /&gt;
    add(chooserPanel);&lt;br /&gt;
    unitGroup.setAlignmentY(TOP_ALIGNMENT);&lt;br /&gt;
    chooserPanel.setAlignmentY(TOP_ALIGNMENT);&lt;br /&gt;
  }&lt;br /&gt;
  // Don&amp;quot;t allow this panel to get taller than its preferred size.&lt;br /&gt;
  // BoxLayout pays attention to maximum size, though most layout&lt;br /&gt;
  // managers don&amp;quot;t.&lt;br /&gt;
  public Dimension getMaximumSize() {&lt;br /&gt;
    return new Dimension(Integer.MAX_VALUE, getPreferredSize().height);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the multiplier (units/meter) for the currently selected unit of&lt;br /&gt;
   * measurement.&lt;br /&gt;
   */&lt;br /&gt;
  public double getMultiplier() {&lt;br /&gt;
    return sliderModel.getMultiplier();&lt;br /&gt;
  }&lt;br /&gt;
  public double getValue() {&lt;br /&gt;
    return sliderModel.getDoubleValue();&lt;br /&gt;
  }&lt;br /&gt;
  /** Updates the text field when the main data model is updated. */&lt;br /&gt;
  public void stateChanged(ChangeEvent e) {&lt;br /&gt;
    int min = sliderModel.getMinimum();&lt;br /&gt;
    int max = sliderModel.getMaximum();&lt;br /&gt;
    double value = sliderModel.getDoubleValue();&lt;br /&gt;
    NumberFormatter formatter = (NumberFormatter) textField.getFormatter();&lt;br /&gt;
    formatter.setMinimum(new Double(min));&lt;br /&gt;
    formatter.setMaximum(new Double(max));&lt;br /&gt;
    textField.setValue(new Double(value));&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Responds to the user choosing a new unit from the combo box.&lt;br /&gt;
   */&lt;br /&gt;
  public void actionPerformed(ActionEvent e) {&lt;br /&gt;
    // Combo box event. Set new maximums for the sliders.&lt;br /&gt;
    int i = unitChooser.getSelectedIndex();&lt;br /&gt;
    sliderModel.setMultiplier(units[i].multiplier);&lt;br /&gt;
    controller.resetMaxValues(false);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Detects when the value of the text field (not necessarily the same number&lt;br /&gt;
   * as you&amp;quot;d get from getText) changes.&lt;br /&gt;
   */&lt;br /&gt;
  public void propertyChange(PropertyChangeEvent e) {&lt;br /&gt;
    if (&amp;quot;value&amp;quot;.equals(e.getPropertyName())) {&lt;br /&gt;
      Number value = (Number) e.getNewValue();&lt;br /&gt;
      sliderModel.setDoubleValue(value.doubleValue());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>