<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8356607320505232977</id><updated>2011-07-30T20:04:34.267-07:00</updated><title type='text'>¢нeтαη Menge</title><subtitle type='html'>JAVA / J2EE / HIBERNATE / ZK (AJAX Based Framework) / KANNEL DEVELOPMENT</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8356607320505232977.post-293423174986946596</id><published>2010-05-28T04:49:00.000-07:00</published><updated>2010-06-04T02:50:21.655-07:00</updated><title type='text'>Multi knob (thumb) JSlider in Swing</title><content type='html'>&lt;b&gt;&lt;br /&gt;This is multi thumb slider using swing.&lt;br /&gt;&lt;br /&gt;As the jSlider provides only the single slider,&lt;br /&gt;This slider contains multi thumb with different color.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* To change this template, choose Tools | Templates&lt;br /&gt;* and open the template in the editor.&lt;br /&gt;*/&lt;br /&gt;package CUSTOMCOMPONENT.jslider;&lt;br /&gt;&lt;br /&gt;import javax.swing.JFrame;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author Chetan Menge &lt;chetan.menge@mettleconsulting.co.in&gt;&lt;br /&gt;* Copyright : USIT&lt;br /&gt;*/&lt;br /&gt;public class MultiSliderDemo {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;JFrame frame = new JFrame("Multislider Demo");&lt;br /&gt;&lt;br /&gt;MultiSlider multiSlider = new MultiSlider(0, 150000);&lt;br /&gt;&lt;br /&gt;multiSlider.setPaintLabels(true);&lt;br /&gt;multiSlider.setPaintTicks(true);&lt;br /&gt;multiSlider.setMajorTickSpacing(15000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;multiSlider.setValueAt(0, 30000);&lt;br /&gt;multiSlider.setValueAt(1, 90000);&lt;br /&gt;&lt;br /&gt;frame.add(multiSlider);&lt;br /&gt;&lt;br /&gt;frame.setSize(500, 500);&lt;br /&gt;frame.setVisible(true);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;-----------------------------------------------------------------------------&lt;br /&gt;/*&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package multithumbslider;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Chetan Menge &lt;chetan.menge@mettleconsulting.co.in&gt;&lt;br /&gt; * Copyright : USIT&lt;br /&gt; */&lt;br /&gt;/* -------------------------------------------------------------------&lt;br /&gt; * GeoVISTA Center (Penn State, Dept. of Geography)&lt;br /&gt; *&lt;br /&gt; * Java source file for the class MultiSlider&lt;br /&gt; *&lt;br /&gt; * Copyright (c), 1999 - 2002, Masahiro Takatsuka and GeoVISTA Center&lt;br /&gt; * All Rights Researved.&lt;br /&gt; *&lt;br /&gt; * Original Author: Masahiro Takatsuka&lt;br /&gt; * $Author: eytanadar $&lt;br /&gt; *&lt;br /&gt; * $Date: 2005/10/05 20:19:52 $&lt;br /&gt; *&lt;br /&gt; *&lt;br /&gt; * Reference:  Document no:&lt;br /&gt; * ___    ___&lt;br /&gt; *&lt;br /&gt; * To Do:&lt;br /&gt; * ___&lt;br /&gt; *&lt;br /&gt;------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* --------------------------- Package ---------------------------- */&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.accessibility.*;&lt;br /&gt;import javax.swing.*;&lt;br /&gt;import javax.swing.plaf.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*====================================================================&lt;br /&gt;Implementation of class MultiSlider&lt;br /&gt;====================================================================*/&lt;br /&gt;/***&lt;br /&gt; * A component that lets the user graphically select values by slding&lt;br /&gt; * multiple thumbs within a bounded interval. MultiSlider inherits all&lt;br /&gt; * fields and methods from javax.swing.JSlider.&lt;br /&gt; * &lt;p&gt; *&lt;br /&gt; * @version $Revision: 1.1 $&lt;br /&gt; * @author Masahiro Takatsuka (masa@jbeans.net)&lt;br /&gt; * @see JSlider&lt;br /&gt; */&lt;br /&gt;public class MultiSlider extends JSlider {&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * @see #getUIClassID&lt;br /&gt;     * @see #readObject&lt;br /&gt;     */&lt;br /&gt;    private static final String uiClassID = "MultiSliderUI";&lt;br /&gt;    /***&lt;br /&gt;     * An array of data models that handle the numeric maximum values,&lt;br /&gt;     * minimum values, and current-position values for the multi slider.&lt;br /&gt;     */&lt;br /&gt;    private BoundedRangeModel[] sliderModels;&lt;br /&gt;    /***&lt;br /&gt;     * If it is true, a thumb is bounded by adjacent thumbs.&lt;br /&gt;     */&lt;br /&gt;    private boolean bounded = false;&lt;br /&gt;    /***&lt;br /&gt;     * This is a color to paint the current thumb&lt;br /&gt;     */&lt;br /&gt;    private Color currentThumbColor = Color.red;&lt;br /&gt;    /***&lt;br /&gt;     * this flag is used to create default anchors.&lt;br /&gt;     */&lt;br /&gt;    transient private boolean useEndPoints = false;&lt;br /&gt;    transient private int valueBeforeStateChange;&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider with the specified orientation and the&lt;br /&gt;     * specified mimimum, maximum, and initial values.&lt;br /&gt;     *&lt;br /&gt;     * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL&lt;br /&gt;     *&lt;br /&gt;     * @see #setOrientation&lt;br /&gt;     * @see #setMinimum&lt;br /&gt;     * @see #setMaximum&lt;br /&gt;     * @see #setValue&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation, int min, int max,&lt;br /&gt;            int val1, int val2) {&lt;br /&gt;        checkOrientation(orientation);&lt;br /&gt;        this.orientation = orientation;&lt;br /&gt;        setNumberOfThumbs(min, max, new int[]{val1, val2});&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider with the specified orientation and the&lt;br /&gt;     * specified mimimum, maximum, and the number of thumbs.&lt;br /&gt;     *&lt;br /&gt;     * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL&lt;br /&gt;     *&lt;br /&gt;     * @see #setOrientation&lt;br /&gt;     * @see #setMinimum&lt;br /&gt;     * @see #setMaximum&lt;br /&gt;     * @see #setValue&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation, int min, int max) {&lt;br /&gt;        checkOrientation(orientation);&lt;br /&gt;        this.orientation = orientation;&lt;br /&gt;        setNumberOfThumbs(min, max, 2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a horizontal slider with the range 0 to 100 and&lt;br /&gt;     * an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider() {&lt;br /&gt;        this(HORIZONTAL, 0, 100);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider using the specified orientation with the&lt;br /&gt;     * range 0 to 100 and an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation) {&lt;br /&gt;        this(orientation, 0, 100);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a horizontal slider using the specified min and max&lt;br /&gt;     * with an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int min, int max) {&lt;br /&gt;        this(HORIZONTAL, min, max);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setCurrentThumbColor(Color c) {&lt;br /&gt;        this.currentThumbColor = c;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Color getCurrentThumbColor() {&lt;br /&gt;        return this.currentThumbColor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getTrackBuffer() {&lt;br /&gt;        return ((MultiSliderUI) this.ui).getTrackBuffer();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Validates the orientation parameter.&lt;br /&gt;     */&lt;br /&gt;    private void checkOrientation(int orientation) {&lt;br /&gt;        switch (orientation) {&lt;br /&gt;            case VERTICAL:&lt;br /&gt;            case HORIZONTAL:&lt;br /&gt;                break;&lt;br /&gt;            default:&lt;br /&gt;                throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Notification from the UIFactory that the L&amp;F has changed.&lt;br /&gt;     * Called to replace the UI with the latest version from the&lt;br /&gt;     * default UIFactory.&lt;br /&gt;     *&lt;br /&gt;     * @see JComponent#updateUI&lt;br /&gt;     */&lt;br /&gt;    public void updateUI() {&lt;br /&gt;        updateLabelUIs();&lt;br /&gt;        MultiSliderUI ui = new MultiSliderUI();&lt;br /&gt;        if (this.sliderModels != null) {&lt;br /&gt;            ui.setThumbCount(this.sliderModels.length);&lt;br /&gt;        }&lt;br /&gt;        setUI((SliderUI) ui);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns the number of thumbs in the slider.&lt;br /&gt;     */&lt;br /&gt;    public int getNumberOfThumbs() {&lt;br /&gt;        return this.sliderModels.length;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int num, boolean useEndPoints) {&lt;br /&gt;        int[] values = createDefaultValues(min, max, num, useEndPoints);&lt;br /&gt;        setNumberOfThumbs(min, max, values);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int num) {&lt;br /&gt;        setNumberOfThumbs(min, max, num, false);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int[] values) {&lt;br /&gt;        if (values == null || values.length &lt; 1) {            values = new int[]{50};        }        int num = values.length;        this.sliderModels = new BoundedRangeModel[num];        for (int i = 0; i &lt; num; i++) {            this.sliderModels[i] = new DefaultBoundedRangeModel(values[i], 0, min, max);            this.sliderModels[i].addChangeListener(changeListener);        }        updateUI();    }    /***     * Sets the number of thumbs.     */    private void setNumberOfThumbs(int num) {        setNumberOfThumbs(num, false);    }    /***     * Sets the number of thumbs.     */    private void setNumberOfThumbs(int num, boolean useEndPoints) {        if (getNumberOfThumbs() != num) {            setNumberOfThumbs(getMinimum(), getMaximum(), num, useEndPoints);        }    }    /***     * Sets the number of thumbs by specifying the initial values.     */    private void setNumberOfThumbs(int[] values) {        setNumberOfThumbs(getMinimum(), getMaximum(), values);    }    /***     * creates evenly spaced values for thumbs.     */    private int[] createDefaultValues(int min, int max, int num_of_values, boolean useEndPoints) {        int[] values = new int[num_of_values];        int range = max - min;        if (!useEndPoints) {            int step = range / (num_of_values + 1);            for (int i = 0; i &lt; num_of_values; i++) {                values[i] = min + (i + 1) * step;            }        } else {            if (num_of_values &lt; 1) {                return new int[0];            }            values[0] = getMinimum();            values[num_of_values - 1] = getMaximum();            int[] def = createDefaultValues(getMinimum(), getMaximum(), num_of_values - 2, false);            for (int i = 0; i &lt; def.length; i++) {                values[i + 1] = def[i];            }        }        return values;    }    /***     * Returns the index number of currently operated thumb.     */    public int getCurrentThumbIndex() {        return ((MultiSliderUI) ui).getCurrentIndex();    }    /***     * Returns data model that handles the sliders three     * fundamental properties: minimum, maximum, value.     *     * @see #setModel     */    public BoundedRangeModel getModel() {        return getModelAt(getCurrentThumbIndex());    }    /***     * Returns data model that handles the sliders three     * fundamental properties: minimum, maximum, value.     *     * @see #setModel     */    public BoundedRangeModel getModelAt(int index) {        if (this.sliderModels == null || index &gt;= this.sliderModels.length) {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        return this.sliderModels[index];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns data model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #setModel&lt;br /&gt;     */&lt;br /&gt;    public BoundedRangeModel[] getModels() {&lt;br /&gt;        return this.sliderModels;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #getModel&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     * description: The sliders BoundedRangeModel.&lt;br /&gt;     */&lt;br /&gt;    public void setModel(BoundedRangeModel newModel) {&lt;br /&gt;        setModelAt(getCurrentThumbIndex(), newModel);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #getModel&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     * description: The sliders BoundedRangeModel.&lt;br /&gt;     */&lt;br /&gt;    public void setModelAt(int index, BoundedRangeModel newModel) {&lt;br /&gt;        BoundedRangeModel oldModel = getModelAt(index);&lt;br /&gt;&lt;br /&gt;        if (oldModel != null) {&lt;br /&gt;            oldModel.removeChangeListener(changeListener);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        this.sliderModels[index] = newModel;&lt;br /&gt;&lt;br /&gt;        if (newModel != null) {&lt;br /&gt;            newModel.addChangeListener(changeListener);&lt;br /&gt;&lt;br /&gt;            if (accessibleContext != null) {&lt;br /&gt;                accessibleContext.firePropertyChange(&lt;br /&gt;                        AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,&lt;br /&gt;                        (oldModel == null&lt;br /&gt;                        ? null : new Integer(oldModel.getValue())),&lt;br /&gt;                        (newModel == null&lt;br /&gt;                        ? null : new Integer(newModel.getValue())));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        firePropertyChange("model", oldModel, this.sliderModels[index]);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the models minimum property.&lt;br /&gt;     *&lt;br /&gt;     * @see #getMinimum&lt;br /&gt;     * @see BoundedRangeModel#setMinimum&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     *   preferred: true&lt;br /&gt;     * description: The sliders minimum value.&lt;br /&gt;     */&lt;br /&gt;    public void setMinimum(int minimum) {&lt;br /&gt;        int count = getNumberOfThumbs();&lt;br /&gt;        int oldMin = getModel().getMinimum();&lt;br /&gt;        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setMinimum(minimum);        }        firePropertyChange("minimum", new Integer(oldMin), new Integer(minimum));    }    /***     * Sets the models maximum property.     *     * @see #getMaximum     * @see BoundedRangeModel#setMaximum     * @beaninfo     *       bound: true     *   preferred: true     * description: The sliders maximum value.     */    public void setMaximum(int maximum) {        int count = getNumberOfThumbs();        int oldMax = getModel().getMaximum();        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setMaximum(maximum);        }        firePropertyChange("maximum", new Integer(oldMax), new Integer(maximum));    }    /***     * Returns the sliders value.     * @return the models value property     * @see #setValue     */    public int getValue() {        return getValueAt(getCurrentThumbIndex());    }    /***     * Returns the sliders value.     * @return the models value property     * @see #setValue     */    public int getValueAt(int index) {        return getModelAt(index).getValue();    }    /***     * Sets the sliders current value.  This method just forwards     * the value to the model.     *     * @see #getValue     * @beaninfo     *   preferred: true     * description: The sliders current value.     */    public void setValue(int n) {        setValueAt(getCurrentThumbIndex(), n);    }    /***     * Sets the sliders current value.  This method just forwards     * the value to the model.     *     * @see #getValue     * @beaninfo     *   preferred: true     * description: The sliders current value.     */    public void setValueAt(int index, int n) {        BoundedRangeModel m = getModelAt(index);        int oldValue = m.getValue();        m.setValue(n);        if (accessibleContext != null) {            accessibleContext.firePropertyChange(                    AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,                    new Integer(oldValue),                    new Integer(m.getValue()));        }    }    /***     * True if the slider knob is being dragged.     *     * @return the value of the models valueIsAdjusting property     * @see #setValueIsAdjusting     */    public boolean getValueIsAdjusting() {        boolean result = false;        int count = getNumberOfThumbs();        for (int i = 0; i &lt; count; i++) {            result = (result || getValueIsAdjustingAt(i));        }        return result;    }    /***     * True if the slider knob is being dragged.     */    public boolean getValueIsAdjustingAt(int index) {        return getModelAt(index).getValueIsAdjusting();    }    /***     * Sets the models valueIsAdjusting property.  Slider look and     * feel implementations should set this property to true when     * a knob drag begins, and to false when the drag ends.  The     * slider model will not generate ChangeEvents while     * valueIsAdjusting is true.     *     * @see #getValueIsAdjusting     * @see BoundedRangeModel#setValueIsAdjusting     * @beaninfo     *      expert: true     * description: True if the slider knob is being dragged.     */    public void setValueIsAdjusting(boolean b) {        setValueIsAdjustingAt(getCurrentThumbIndex(), b);    }    /***     * Sets the models valueIsAdjusting property.  Slider look and     * feel implementations should set this property to true when     * a knob drag begins, and to false when the drag ends.  The     * slider model will not generate ChangeEvents while     * valueIsAdjusting is true.     */    public void setValueIsAdjustingAt(int index, boolean b) {        BoundedRangeModel m = getModelAt(index);        boolean oldValue = m.getValueIsAdjusting();        m.setValueIsAdjusting(b);        if ((oldValue != b) &amp;&amp; (accessibleContext != null)) {            accessibleContext.firePropertyChange(                    AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                    ((oldValue) ? AccessibleState.BUSY : null),                    ((b) ? AccessibleState.BUSY : null));        }    }    /***     * Sets the size of the range "covered" by the knob.  Most look     * and feel implementations will change the value by this amount     * if the user clicks on either side of the knob.     *     * @see #getExtent     * @see BoundedRangeModel#setExtent     * @beaninfo     *      expert: true     * description: Size of the range covered by the knob.     */    public void setExtent(int extent) {        int count = getNumberOfThumbs();        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setExtent(extent);        }    }    /***     * Sets a bounded attribute of a slider thumb.     * &lt;PRE&gt;&lt;br /&gt;&lt;br /&gt;     * &lt;/PRE&gt;     *&lt;br /&gt;     * @param b&lt;br /&gt;     * @return void&lt;br /&gt;     */&lt;br /&gt;    public void setBounded(boolean b) {&lt;br /&gt;        this.bounded = b;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns a bounded attribute of a slider thumb.&lt;br /&gt;     * &lt;PRE&gt;     * &lt;/PRE&gt;     *&lt;br /&gt;     * @return boolean&lt;br /&gt;     */&lt;br /&gt;    public boolean isBounded() {&lt;br /&gt;        return this.bounded;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getValueBeforeStateChange() {&lt;br /&gt;        return this.valueBeforeStateChange;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void setValueBeforeStateChange(int v) {&lt;br /&gt;        this.valueBeforeStateChange = v;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;        public void drawLine(Graphics g, Point orgn, Point dest,Color c,int sub) {&lt;br /&gt;        g.setColor(c);&lt;br /&gt;        g.drawLine((int) 21, (int) orgn.getY()-sub, (int) dest.getX(), (int) dest.getY()-sub);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package multithumbslider;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Chetan Menge &lt;chetan.menge@mettleconsulting.co.in&gt;&lt;br /&gt; * Copyright : USIT&lt;br /&gt; */&lt;br /&gt;/* -------------------------------------------------------------------&lt;br /&gt; * GeoVISTA Center (Penn State, Dept. of Geography)&lt;br /&gt; *&lt;br /&gt; * Java source file for the class MultiSliderUI&lt;br /&gt; *&lt;br /&gt; * Copyright (c), 1999 - 2002, Masahiro Takatsuka and GeoVISTA Center&lt;br /&gt; * All Rights Researved.&lt;br /&gt; *&lt;br /&gt; * Original Author: Masahiro Takatsuka&lt;br /&gt; * $Author: eytanadar $&lt;br /&gt; *&lt;br /&gt; * $Date: 2005/10/05 20:19:52 $&lt;br /&gt; *&lt;br /&gt; *&lt;br /&gt; * Reference:  Document no:&lt;br /&gt; * ___    ___&lt;br /&gt; *&lt;br /&gt; * To Do:&lt;br /&gt; * ___&lt;br /&gt; *&lt;br /&gt;------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* --------------------------- Package ---------------------------- */&lt;br /&gt;import java.awt.*;&lt;br /&gt;import java.awt.event.*;&lt;br /&gt;import java.net.URL;&lt;br /&gt;&lt;br /&gt;import javax.swing.*;&lt;br /&gt;import javax.swing.plaf.*;&lt;br /&gt;import javax.swing.plaf.basic.*;&lt;br /&gt;import javax.swing.plaf.basic.BasicSliderUI.*;&lt;br /&gt;import javax.swing.plaf.metal.*;&lt;br /&gt;&lt;br /&gt;/*====================================================================&lt;br /&gt;Implementation of class MultiSliderUI&lt;br /&gt;====================================================================*/&lt;br /&gt;/***&lt;br /&gt; * A Basic L&amp;F implementation of SliderUI.&lt;br /&gt; *&lt;br /&gt; * @version $Revision: 1.1 $&lt;br /&gt; * @author Masahiro Takatsuka (masa@jbeans.net)&lt;br /&gt; * @see MetalSliderUI&lt;br /&gt; */&lt;br /&gt;class MultiSliderUI extends BasicSliderUI {&lt;br /&gt;&lt;br /&gt;    private Rectangle[] thumbRects = null;&lt;br /&gt;    private int thumbCount;&lt;br /&gt;    transient private int currentIndex = 0;&lt;br /&gt;    transient private boolean isDragging;&lt;br /&gt;    transient private int[] minmaxIndices = new int[2];&lt;br /&gt;    protected boolean filledSlider = true;&lt;br /&gt;    private Color firstThumbColor = new Color(0, 102, 0);&lt;br /&gt;    private Color secondThumbColor = new Color(223, 1, 1);&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * ComponentUI Interface Implementation methods&lt;br /&gt;     */&lt;br /&gt;    public static ComponentUI createUI(JComponent b) {&lt;br /&gt;        return new MultiSliderUI();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Construct a new MultiSliderUI object.&lt;br /&gt;     */&lt;br /&gt;    public MultiSliderUI() {&lt;br /&gt;        super(null);&lt;br /&gt;        filledSlider = true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    int getTrackBuffer() {&lt;br /&gt;        return this.trackBuffer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Rectangle[] getThumbRects() {&lt;br /&gt;        return thumbRects;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of Thumbs.&lt;br /&gt;     */&lt;br /&gt;    public void setThumbCount(int count) {&lt;br /&gt;        this.thumbCount = count;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns the index number of the thumb currently operated.&lt;br /&gt;     */&lt;br /&gt;    protected int getCurrentIndex() {&lt;br /&gt;        return this.currentIndex;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void installUI(JComponent c) {&lt;br /&gt;        this.thumbRects = new Rectangle[this.thumbCount];&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i] = new Rectangle();        }        this.currentIndex = 0;        if (this.thumbCount &gt; 0) {&lt;br /&gt;            thumbRect = this.thumbRects[this.currentIndex];&lt;br /&gt;        }&lt;br /&gt;        super.installUI(c);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void uninstallUI(JComponent c) {&lt;br /&gt;        super.uninstallUI(c);&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i] = null;        }        this.thumbRects = null;    }    protected void installListeners(JSlider slider) {//        slider.addMouseListener(trackListener);        //   slider.addMouseMotionListener(trackListener);        slider.addFocusListener(focusListener);        slider.addComponentListener(componentListener);        slider.addPropertyChangeListener(propertyChangeListener);        for (int i = 0; i &lt; this.thumbCount; i++) {            ((MultiSlider) slider).getModelAt(i).addChangeListener(changeListener);        }    }    protected void uninstallListeners(JSlider slider) {        slider.removeMouseListener(trackListener);        slider.removeMouseMotionListener(trackListener);        slider.removeFocusListener(focusListener);        slider.removeComponentListener(componentListener);        slider.removePropertyChangeListener(propertyChangeListener);        for (int i = 0; i &lt; this.thumbCount; i++) {            BoundedRangeModel model = ((MultiSlider) slider).getModelAt(i);            if (model != null) {                model.removeChangeListener(changeListener);            }        }    }    @Override    protected void calculateThumbSize() {        Dimension size = new Dimension(10, 15);//getThumbSize();        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i].setSize(size.width, size.height);        }        thumbRect.setSize(size.width, size.height);    }    protected void calculateThumbLocation() {        MultiSlider slider = (MultiSlider) this.slider;        int majorTickSpacing = slider.getMajorTickSpacing();        int minorTickSpacing = slider.getMinorTickSpacing();        int tickSpacing = 0;        if (minorTickSpacing &gt; 0) {&lt;br /&gt;            tickSpacing = minorTickSpacing;&lt;br /&gt;        } else if (majorTickSpacing &gt; 0) {&lt;br /&gt;            tickSpacing = majorTickSpacing;&lt;br /&gt;        }&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            if (slider.getSnapToTicks()) {                int sliderValue = slider.getValueAt(i);                int snappedValue = sliderValue;                if (tickSpacing != 0) {                    // If it's not on a tick, change the value                    if ((sliderValue - slider.getMinimum()) % tickSpacing != 0) {                        float temp = (float) (sliderValue - slider.getMinimum()) / (float) tickSpacing;                        int whichTick = Math.round(temp);                        snappedValue = slider.getMinimum() + (whichTick * tickSpacing);                    }                    if (snappedValue != sliderValue) {                        slider.setValueAt(i, snappedValue);                    }                }            }            if (slider.getOrientation() == JSlider.HORIZONTAL) {                int valuePosition = xPositionForValue(slider.getValueAt(i));                this.thumbRects[i].x = valuePosition - (this.thumbRects[i].width / 2);                this.thumbRects[i].y = trackRect.y;            } else {                int valuePosition = yPositionForValue(slider.getValueAt(i));                this.thumbRects[i].x = trackRect.x;                this.thumbRects[i].y = valuePosition - (this.thumbRects[i].height / 2);            }        }    }    public void paint(Graphics g, JComponent c) {        //  super.paint(g, c);             recalculateIfInsetsChanged();        recalculateIfOrientationChanged();        Rectangle clip = g.getClipBounds();        if (slider.getPaintTrack() &amp;&amp; clip.intersects(trackRect)) {            paintTrack(g);        }        if (slider.getPaintTicks() &amp;&amp; clip.intersects(tickRect)) {            paintTicks(g);        }        if (slider.getPaintLabels() &amp;&amp; clip.intersects(labelRect)) {            paintLabels(g);        }        if (slider.hasFocus() &amp;&amp; clip.intersects(focusRect)) {            paintFocus(g);        }        // first paint unfocused thumbs.        for (int i = 0; i &lt; this.thumbCount; i++) {            if (i != this.currentIndex) {                if (clip.intersects(this.thumbRects[i])) {                    thumbRect = this.thumbRects[i];                    paintThumb(g,secondThumbColor);                }            }        }        // then paint currently focused thumb.        if (clip.intersects(this.thumbRects[this.currentIndex])) {            thumbRect = this.thumbRects[this.currentIndex];            // thumbRect.setSize(5, 5);            paintThumb(g,firstThumbColor);        }    }    public void paintThumb(Graphics g,Color thumbColor) {        //   super.paintThumb(g);             Color highlightColor = UIManager.getColor("Slider.highlight");        Color shadowColor = UIManager.getColor("Slider.shadow");        Rectangle knobBounds = thumbRect;        int w = knobBounds.width - 4;        int h = knobBounds.height + 1;        g.translate(knobBounds.x, knobBounds.y - 21);        if (slider.isEnabled()) {            g.setColor(slider.getBackground());        } else {            g.setColor(slider.getBackground().darker());        }        Boolean paintThumbArrowShape =                (Boolean) slider.getClientProperty("Slider.paintThumbArrowShape");        if ((!slider.getPaintTicks() &amp;&amp; paintThumbArrowShape == null)                || paintThumbArrowShape == Boolean.FALSE) {            // "plain" version            g.fillRect(0, 0, w, h);            g.setColor(Color.black);            g.drawLine(0, h - 1, w - 1, h - 1);            g.drawLine(w - 1, 0, w - 1, h - 1);            g.setColor(highlightColor);            g.drawLine(0, 0, 0, h - 2);            g.drawLine(1, 0, w - 2, 0);            g.setColor(shadowColor);            g.drawLine(1, h - 2, w - 2, h - 2);            g.drawLine(w - 2, 1, w - 2, h - 3);        } else if (slider.getOrientation() == JSlider.HORIZONTAL) {            int cw = w / 2;          //  g.setColor(Color.blue);   /// thumb color            g.setColor(thumbColor);   /// thumb color            g.fillRect(1, 1, w - 3, h - 1 - cw);            Polygon p = new Polygon();            p.addPoint(1, h - cw);            p.addPoint(cw - 1, h - 1);            p.addPoint(w - 2, h - 1 - cw);            g.fillPolygon(p);            g.setColor(highlightColor);            g.drawLine(0, 0, w - 2, 0);            g.drawLine(0, 1, 0, h - 1 - cw);            g.drawLine(0, h - cw, cw - 1, h - 1);            g.setColor(Color.black);            g.drawLine(w - 1, 0, w - 1, h - 2 - cw);            g.drawLine(w - 1, h - 1 - cw, w - 1 - cw, h - 1);            g.setColor(shadowColor);            g.drawLine(w - 2, 1, w - 2, h - 2 - cw);            g.drawLine(w - 2, h - 1 - cw, w - 1 - cw, h - 2);        }        g.translate(-knobBounds.x, -knobBounds.y + 21);        /*   Icon SAFE_HORIZ_THUMB_ICON = null;        URL imgURL = getClass().getResource("sliderIconBlue.jpg");        //    System.out.println("the img url --" + imgURL);        if (imgURL != null) {        SAFE_HORIZ_THUMB_ICON = new ImageIcon(imgURL, "");        }        // SAFE_HORIZ_THUMB_ICON=      UIManager.getIcon("Slider.horizontalThumbIcon");        Rectangle knobBounds = thumbRect;        g.translate(knobBounds.x, knobBounds.y);        if (slider.getOrientation() == JSlider.HORIZONTAL) {        SAFE_HORIZ_THUMB_ICON.paintIcon(slider, g, 0, -25);        //SAFE_HORIZ_THUMB_ICON.        } else {        SAFE_HORIZ_THUMB_ICON.paintIcon(slider, g, 0, 0);        }        g.translate(-knobBounds.x, -knobBounds.y);*/    }    public void paintTrack(Graphics g) {        //super.paintTrack(g);        Color trackColor = !slider.isEnabled() ? MetalLookAndFeel.getControlShadow()                : slider.getForeground();        boolean leftToRight = true;//MetalUtils.isLeftToRight(slider);        g.translate(trackRect.x, trackRect.y + 10);        int trackLeft = 0;        int trackTop = 0;        int trackRight = 0;        int trackBottom = 0;        // Draw the track        if (slider.getOrientation() == JSlider.HORIZONTAL) {            trackBottom = (trackRect.height - 1) - getThumbOverhang();            trackTop = trackBottom - (getTrackWidth() - 1);            trackRight = trackRect.width - 1;        } else {            if (leftToRight) {                trackLeft = (trackRect.width - getThumbOverhang())                        - getTrackWidth();                trackRight = (trackRect.width - getThumbOverhang()) - 1;            } else {                trackLeft = getThumbOverhang();                trackRight = getThumbOverhang() + getTrackWidth() - 1;            }            trackBottom = trackRect.height - 1;        }        if (slider.isEnabled()) {            g.setColor(MetalLookAndFeel.getControlDarkShadow());            g.drawRect(trackLeft, trackTop,                    (trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1);            g.setColor(MetalLookAndFeel.getControlHighlight());            g.drawLine(trackLeft + 1, trackBottom, trackRight, trackBottom);            g.drawLine(trackRight, trackTop + 1, trackRight, trackBottom);            g.setColor(MetalLookAndFeel.getControlShadow());            g.drawLine(trackLeft + 1, trackTop + 1, trackRight - 2, trackTop + 1);            g.drawLine(trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 2);            g.setColor(new Color(0, 128, 0));            g.drawLine(trackLeft, trackTop - 3, (int) this.thumbRects[0].getX() - 16, trackTop - 3);            g.setColor(Color.red);            g.drawLine(trackLeft, trackTop - 6, (int) this.thumbRects[1].getX() - 16, trackTop - 6);            g.setColor(MetalLookAndFeel.getControlShadow());        } else {            g.setColor(MetalLookAndFeel.getControlShadow());            g.drawRect(trackLeft, trackTop,                    (trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1);        }        // Draw the fill        if (filledSlider) {            int middleOfThumb = 0;            int fillTop = 0;            int fillLeft = 0;            int fillBottom = 0;            int fillRight = 0;            if (slider.getOrientation() == JSlider.HORIZONTAL) {                middleOfThumb = thumbRect.x + (thumbRect.width / 2);                middleOfThumb -= trackRect.x; // To compensate for the g.translate()                fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;                fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;                if (!drawInverted()) {                    fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;                    fillRight = middleOfThumb;                } else {                    fillLeft = middleOfThumb;                    fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;                }            } else {                middleOfThumb = thumbRect.y + (thumbRect.height / 2);                middleOfThumb -= trackRect.y; // To compensate for the g.translate()                fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;                fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;                if (!drawInverted()) {                    fillTop = middleOfThumb;                    fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;                } else {                    fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;                    fillBottom = middleOfThumb;                }            }            if (slider.isEnabled()) {                //   g.setColor( Color.RED);                g.drawLine(fillLeft, fillTop, fillRight, fillTop);                g.drawLine(fillLeft, fillTop, fillLeft, fillBottom);                //g.setColor( Color.green );                g.fillRect(fillLeft + 1, fillTop + 1,                        fillRight - fillLeft, fillBottom - fillTop);            } else {                g.setColor(MetalLookAndFeel.getControlShadow());                g.fillRect(fillLeft, fillTop,                        fillRight - fillLeft, trackBottom - trackTop);            }        }        g.translate(-trackRect.x, -trackRect.y);    }    public void scrollByBlock(int direction) {        synchronized (slider) {            int oldValue = ((MultiSlider) slider).getValueAt(this.currentIndex);            int blockIncrement = slider.getMaximum() / 10;            int delta = blockIncrement * ((direction &gt; 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);&lt;br /&gt;            ((MultiSlider) slider).setValueAt(this.currentIndex, oldValue + delta);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void scrollByUnit(int direction) {&lt;br /&gt;        synchronized (slider) {&lt;br /&gt;            int oldValue = ((MultiSlider) slider).getValueAt(this.currentIndex);&lt;br /&gt;            int delta = 1 * ((direction &gt; 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);&lt;br /&gt;            ((MultiSlider) slider).setValueAt(this.currentIndex, oldValue + delta);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected TrackListener createTrackListener(JSlider slider) {&lt;br /&gt;        return new MultiTrackListener();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Track Listener Class tracks mouse movements.&lt;br /&gt;     */&lt;br /&gt;    class MultiTrackListener extends BasicSliderUI.TrackListener {&lt;br /&gt;&lt;br /&gt;        int _trackTop;&lt;br /&gt;        int _trackBottom;&lt;br /&gt;        int _trackLeft;&lt;br /&gt;        int _trackRight;&lt;br /&gt;        transient private int[] firstXY = new int[2];&lt;br /&gt;&lt;br /&gt;        /***&lt;br /&gt;         * If the mouse is pressed above the "thumb" component&lt;br /&gt;         * then reduce the scrollbars value by one page ("page up"),&lt;br /&gt;         * otherwise increase it by one page.  If there is no&lt;br /&gt;         * thumb then page up if the mouse is in the upper half&lt;br /&gt;         * of the track.&lt;br /&gt;         */&lt;br /&gt;        public void mousePressed(MouseEvent e) {&lt;br /&gt;            int[] neighbours = new int[2];&lt;br /&gt;            boolean bounded = ((MultiSlider) slider).isBounded();&lt;br /&gt;            if (!slider.isEnabled()) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            currentMouseX = e.getX();&lt;br /&gt;            currentMouseY = e.getY();&lt;br /&gt;            firstXY[0] = currentMouseX;&lt;br /&gt;            firstXY[1] = currentMouseY;&lt;br /&gt;&lt;br /&gt;            slider.requestFocus();&lt;br /&gt;            // Clicked in the Thumb area?&lt;br /&gt;            minmaxIndices[0] = -1;&lt;br /&gt;            minmaxIndices[1] = -1;&lt;br /&gt;            for (int i = 0; i &lt; MultiSliderUI.this.thumbCount; i++) {                if (MultiSliderUI.this.thumbRects[i].contains(currentMouseX, currentMouseY)) {                    if (minmaxIndices[0] == -1) {                        minmaxIndices[0] = i;                        MultiSliderUI.this.currentIndex = i;                    }                    if (minmaxIndices[1] &lt; i) {                        minmaxIndices[1] = i;                    }                    switch (slider.getOrientation()) {                        case JSlider.VERTICAL:                            offset = currentMouseY - MultiSliderUI.this.thumbRects[i].y;                            break;                        case JSlider.HORIZONTAL:                            offset = currentMouseX - MultiSliderUI.this.thumbRects[i].x;                            break;                    }                    MultiSliderUI.this.isDragging = true;                    thumbRect = MultiSliderUI.this.thumbRects[i];                    if (bounded) {                        neighbours[0] = ((i - 1) &lt; 0) ? -1 : (i - 1);                        neighbours[1] = ((i + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (i + 1);&lt;br /&gt;                        //findClosest(currentMouseX, currentMouseY, neighbours, i);&lt;br /&gt;                    } else {&lt;br /&gt;                        MultiSliderUI.this.currentIndex = i;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(i, true);&lt;br /&gt;                        neighbours[0] = -1;&lt;br /&gt;                        neighbours[1] = -1;&lt;br /&gt;                    }&lt;br /&gt;                    setThumbBounds(neighbours);&lt;br /&gt;                    //return;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if (minmaxIndices[0] &gt; -1) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            MultiSliderUI.this.currentIndex = findClosest(currentMouseX, currentMouseY, neighbours, -1);&lt;br /&gt;            thumbRect = MultiSliderUI.this.thumbRects[MultiSliderUI.this.currentIndex];&lt;br /&gt;            MultiSliderUI.this.isDragging = false;&lt;br /&gt;            ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, true);&lt;br /&gt;&lt;br /&gt;            Dimension sbSize = slider.getSize();&lt;br /&gt;            int direction = POSITIVE_SCROLL;&lt;br /&gt;&lt;br /&gt;            switch (slider.getOrientation()) {&lt;br /&gt;                case JSlider.VERTICAL:&lt;br /&gt;                    if (thumbRect.isEmpty()) {&lt;br /&gt;                        int scrollbarCenter = sbSize.height / 2;&lt;br /&gt;                        if (!drawInverted()) {&lt;br /&gt;                            direction = (currentMouseY &lt; scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        } else {                            direction = (currentMouseY &lt; scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        }                    } else {                        int thumbY = thumbRect.y;                        if (!drawInverted()) {                            direction = (currentMouseY &lt; thumbY) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        } else {                            direction = (currentMouseY &lt; thumbY) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        }                    }                    break;                case JSlider.HORIZONTAL:                    if (thumbRect.isEmpty()) {                        int scrollbarCenter = sbSize.width / 2;                        if (!drawInverted()) {                            direction = (currentMouseX &lt; scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        } else {                            direction = (currentMouseX &lt; scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        }                    } else {                        int thumbX = thumbRect.x;                        if (!drawInverted()) {                            direction = (currentMouseX &lt; thumbX) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        } else {                            direction = (currentMouseX &lt; thumbX) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        }                    }                    break;            }            scrollDueToClickInTrack(direction);            Rectangle r = thumbRect;            if (!r.contains(currentMouseX, currentMouseY)) {                if (shouldScroll(direction)) {                    scrollTimer.stop();                    scrollListener.setDirection(direction);                    scrollTimer.start();                }            }        }        /***         * Sets a track bound for th thumb currently operated.         */        private void setThumbBounds(int[] neighbours) {            int halfThumbWidth = thumbRect.width / 2;            int halfThumbHeight = thumbRect.height / 2;            switch (slider.getOrientation()) {                case JSlider.VERTICAL:                    _trackTop = (neighbours[1] == -1) ? trackRect.y : MultiSliderUI.this.thumbRects[neighbours[1]].y + halfThumbHeight;                    _trackBottom = (neighbours[0] == -1) ? trackRect.y + (trackRect.height - 1) : MultiSliderUI.this.thumbRects[neighbours[0]].y + halfThumbHeight;                    break;                case JSlider.HORIZONTAL:                    _trackLeft = (neighbours[0] == -1) ? trackRect.x : MultiSliderUI.this.thumbRects[neighbours[0]].x + halfThumbWidth;                    _trackRight = (neighbours[1] == -1) ? trackRect.x + (trackRect.width - 1) : MultiSliderUI.this.thumbRects[neighbours[1]].x + halfThumbWidth;                    break;            }        }        /*         * this is a very lazy way to find the closest.  One might want to         * implement a much faster algorithm.         */        private int findClosest(int x, int y, int[] neighbours, int excluded) {            int orientation = slider.getOrientation();            int rightmin = Integer.MAX_VALUE; // for dxw, dy            int leftmin = -Integer.MAX_VALUE; // for dx, dyh            int dx = 0;            int dxw = 0;            int dy = 0;            int dyh = 0;            neighbours[0] = -1; // left            neighbours[1] = -1; // right            for (int i = 0; i &lt; MultiSliderUI.this.thumbCount; i++) {                if (i == excluded) {                    continue;                }                switch (orientation) {                    case JSlider.VERTICAL:                        dy = MultiSliderUI.this.thumbRects[i].y - y;                        dyh = (MultiSliderUI.this.thumbRects[i].y + MultiSliderUI.this.thumbRects[i].height) - y;                        if (dyh &lt;= 0) {                            if (dyh &gt; leftmin) { // has to be &gt; and not &gt;=&lt;br /&gt;                                leftmin = dyh;&lt;br /&gt;                                neighbours[0] = i;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        if (dy &gt;= 0) {&lt;br /&gt;                            if (dy &lt;= rightmin) {                                rightmin = dy;                                neighbours[1] = i;                            }                        }                        break;                    case JSlider.HORIZONTAL:                        dx = MultiSliderUI.this.thumbRects[i].x - x;                        dxw = (MultiSliderUI.this.thumbRects[i].x + MultiSliderUI.this.thumbRects[i].width) - x;                        if (dxw &lt;= 0) {                            if (dxw &gt;= leftmin) {&lt;br /&gt;                                leftmin = dxw;&lt;br /&gt;                                neighbours[0] = i;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        if (dx &gt;= 0) {&lt;br /&gt;                            if (dx &lt; rightmin) { // has to be &lt; and not &lt;=                                rightmin = dx;                                neighbours[1] = i;                            }                        }                        break;                }            }            //System.out.println("neighbours = " + neighbours[0] + ", " + neighbours[1]);            int closest = (Math.abs(leftmin) &lt;= Math.abs(rightmin)) ? neighbours[0] : neighbours[1];            return (closest == -1) ? 0 : closest;        }        /***         * Set the models value to the position of the top/left         * of the thumb relative to the origin of the track.         */        public void mouseDragged(MouseEvent e) {            ((MultiSlider) MultiSliderUI.this.slider).setValueBeforeStateChange(((MultiSlider) MultiSliderUI.this.slider).getValueAt(MultiSliderUI.this.currentIndex));            int thumbMiddle = 0;            boolean bounded = ((MultiSlider) slider).isBounded();            if (!slider.isEnabled()) {                return;            }            currentMouseX = e.getX();            currentMouseY = e.getY();            if (!MultiSliderUI.this.isDragging) {                return;            }            switch (slider.getOrientation()) {                case JSlider.VERTICAL:                    int halfThumbHeight = thumbRect.height / 2;                    int thumbTop = e.getY() - offset;                    if (bounded) {                        int[] neighbours = new int[2];                        int idx = -1;                        int diff = e.getY() - firstXY[1];                        //System.out.println("diff = " + diff);                        if (e.getY() - firstXY[1] &gt; 0) {&lt;br /&gt;                            idx = minmaxIndices[0];&lt;br /&gt;                        } else {&lt;br /&gt;                            idx = minmaxIndices[1];&lt;br /&gt;                        }&lt;br /&gt;                        minmaxIndices[0] = minmaxIndices[1] = idx;&lt;br /&gt;                        //System.out.println("idx = " + idx);&lt;br /&gt;                        if (idx == -1) {&lt;br /&gt;                            break;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        //System.out.println("thumbTop = " + thumbTop);&lt;br /&gt;                        neighbours[0] = ((idx - 1) &lt; 0) ? -1 : (idx - 1);                        neighbours[1] = ((idx + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (idx + 1);&lt;br /&gt;                        thumbRect = MultiSliderUI.this.thumbRects[idx];&lt;br /&gt;                        MultiSliderUI.this.currentIndex = idx;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(idx, true);&lt;br /&gt;                        setThumbBounds(neighbours);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    thumbTop = Math.max(thumbTop, _trackTop - halfThumbHeight);&lt;br /&gt;                    thumbTop = Math.min(thumbTop, _trackBottom - halfThumbHeight);&lt;br /&gt;&lt;br /&gt;                    setThumbLocation(thumbRect.x, thumbTop);&lt;br /&gt;&lt;br /&gt;                    thumbMiddle = thumbTop + halfThumbHeight;&lt;br /&gt;                    ((MultiSlider) slider).setValueAt(MultiSliderUI.this.currentIndex, valueForYPosition(thumbMiddle));&lt;br /&gt;                    break;&lt;br /&gt;                case JSlider.HORIZONTAL:&lt;br /&gt;                    int halfThumbWidth = thumbRect.width / 2;&lt;br /&gt;                    int thumbLeft = e.getX() - offset;&lt;br /&gt;                    if (bounded) {&lt;br /&gt;                        int[] neighbours = new int[2];&lt;br /&gt;                        int idx = -1;&lt;br /&gt;                        if (e.getX() - firstXY[0] &lt;= 0) {                            idx = minmaxIndices[0];                        } else {                            idx = minmaxIndices[1];                        }                        minmaxIndices[0] = minmaxIndices[1] = idx;                        //System.out.println("idx = " + idx);                        if (idx == -1) {                            break;                        }                        //System.out.println("thumbLeft = " + thumbLeft);                        neighbours[0] = ((idx - 1) &lt; 0) ? -1 : (idx - 1);                        neighbours[1] = ((idx + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (idx + 1);&lt;br /&gt;                        thumbRect = MultiSliderUI.this.thumbRects[idx];&lt;br /&gt;                        MultiSliderUI.this.currentIndex = idx;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(idx, true);&lt;br /&gt;                        setThumbBounds(neighbours);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    thumbLeft = Math.max(thumbLeft, _trackLeft - halfThumbWidth);&lt;br /&gt;                    thumbLeft = Math.min(thumbLeft, _trackRight - halfThumbWidth);&lt;br /&gt;&lt;br /&gt;                    setThumbLocation(thumbLeft, thumbRect.y);&lt;br /&gt;&lt;br /&gt;                    thumbMiddle = thumbLeft + halfThumbWidth;&lt;br /&gt;&lt;br /&gt;                    ((MultiSlider) slider).setValueAt(MultiSliderUI.this.currentIndex, valueForXPosition(thumbMiddle));&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    return;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void mouseReleased(MouseEvent e) {&lt;br /&gt;            if (!slider.isEnabled()) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            offset = 0;&lt;br /&gt;            scrollTimer.stop();&lt;br /&gt;&lt;br /&gt;            if (slider.getSnapToTicks()) {&lt;br /&gt;                MultiSliderUI.this.isDragging = false;&lt;br /&gt;                ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, false);&lt;br /&gt;            } else {&lt;br /&gt;                ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, false);&lt;br /&gt;                MultiSliderUI.this.isDragging = false;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            slider.repaint();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * A static version of the above.&lt;br /&gt;     */&lt;br /&gt;    static class SharedActionScroller extends AbstractAction {&lt;br /&gt;&lt;br /&gt;        int _dir;&lt;br /&gt;        boolean _block;&lt;br /&gt;&lt;br /&gt;        public SharedActionScroller(int dir, boolean block) {&lt;br /&gt;            _dir = dir;&lt;br /&gt;            _block = block;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void actionPerformed(ActionEvent e) {&lt;br /&gt;            JSlider slider = (JSlider) e.getSource();&lt;br /&gt;            MultiSliderUI ui = (MultiSliderUI) slider.getUI();&lt;br /&gt;            if (_dir == NEGATIVE_SCROLL || _dir == POSITIVE_SCROLL) {&lt;br /&gt;                int realDir = _dir;&lt;br /&gt;                if (slider.getInverted()) {&lt;br /&gt;                    realDir = _dir == NEGATIVE_SCROLL ? POSITIVE_SCROLL : NEGATIVE_SCROLL;&lt;br /&gt;                }&lt;br /&gt;                if (_block) {&lt;br /&gt;                    ui.scrollByBlock(realDir);&lt;br /&gt;                } else {&lt;br /&gt;                    ui.scrollByUnit(realDir);&lt;br /&gt;                }&lt;br /&gt;            } else {&lt;br /&gt;                if (slider.getInverted()) {&lt;br /&gt;                    if (_dir == MIN_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMaximum());&lt;br /&gt;                    } else if (_dir == MAX_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMinimum());&lt;br /&gt;                    }&lt;br /&gt;                } else {&lt;br /&gt;                    if (_dir == MIN_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMinimum());&lt;br /&gt;                    } else if (_dir == MAX_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMaximum());&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns the shorter dimension of the track.&lt;br /&gt;     */&lt;br /&gt;    protected int getTrackWidth() {&lt;br /&gt;        // This strange calculation is here to keep the&lt;br /&gt;        // track in proportion to the thumb.&lt;br /&gt;        final double kIdealTrackWidth = 7.0;&lt;br /&gt;        final double kIdealThumbHeight = 16.0;&lt;br /&gt;        final double kWidthScalar = kIdealTrackWidth / kIdealThumbHeight;&lt;br /&gt;&lt;br /&gt;        if (slider.getOrientation() == JSlider.HORIZONTAL) {&lt;br /&gt;            return (int) (kWidthScalar * thumbRect.height);&lt;br /&gt;        } else {&lt;br /&gt;            return (int) (kWidthScalar * thumbRect.width);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Returns the amount that the thumb goes past the slide bar.&lt;br /&gt;     */&lt;br /&gt;    protected int getThumbOverhang() {&lt;br /&gt;        return (int) (getThumbSize().getHeight() - getTrackWidth()) / 2;&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8356607320505232977-293423174986946596?l=chetanmenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/293423174986946596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8356607320505232977&amp;postID=293423174986946596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/293423174986946596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/293423174986946596'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/2010/05/multisliderdemo.html' title='Multi knob (thumb) JSlider in Swing'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8356607320505232977.post-2830179323495742033</id><published>2010-05-28T04:43:00.002-07:00</published><updated>2010-05-28T04:43:51.142-07:00</updated><title type='text'>MultiSliderUI</title><content type='html'>/*&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package CUSTOMCOMPONENT.jslider;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Chetan Menge &lt;chetan.menge@mettleconsulting.co.in&gt;&lt;br /&gt; * Copyright : USIT&lt;br /&gt; */&lt;br /&gt;/* -------------------------------------------------------------------&lt;br /&gt; * GeoVISTA Center (Penn State, Dept. of Geography)&lt;br /&gt; *&lt;br /&gt; * Java source file for the class MultiSliderUI&lt;br /&gt; *&lt;br /&gt; * Copyright (c), 1999 - 2002, Masahiro Takatsuka and GeoVISTA Center&lt;br /&gt; * All Rights Researved.&lt;br /&gt; *&lt;br /&gt; * Original Author: Masahiro Takatsuka&lt;br /&gt; * $Author: eytanadar $&lt;br /&gt; *&lt;br /&gt; * $Date: 2005/10/05 20:19:52 $&lt;br /&gt; *&lt;br /&gt; *&lt;br /&gt; * Reference:  Document no:&lt;br /&gt; * ___    ___&lt;br /&gt; *&lt;br /&gt; * To Do:&lt;br /&gt; * ___&lt;br /&gt; *&lt;br /&gt;------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* --------------------------- Package ---------------------------- */&lt;br /&gt;import java.awt.*;&lt;br /&gt;import java.awt.event.*;&lt;br /&gt;&lt;br /&gt;import javax.swing.*;&lt;br /&gt;import javax.swing.plaf.*;&lt;br /&gt;import javax.swing.plaf.basic.*;&lt;br /&gt;import javax.swing.plaf.basic.BasicSliderUI.*;&lt;br /&gt;import javax.swing.plaf.metal.*;&lt;br /&gt;&lt;br /&gt;/*====================================================================&lt;br /&gt;Implementation of class MultiSliderUI&lt;br /&gt;====================================================================*/&lt;br /&gt;/***&lt;br /&gt; * A Basic L&amp;F implementation of SliderUI.&lt;br /&gt; *&lt;br /&gt; * @version $Revision: 1.1 $&lt;br /&gt; * @author Masahiro Takatsuka (masa@jbeans.net)&lt;br /&gt; * @see MetalSliderUI&lt;br /&gt; */&lt;br /&gt;class MultiSliderUI extends MetalSliderUI {&lt;br /&gt;&lt;br /&gt;    private Rectangle[] thumbRects = null;&lt;br /&gt;    private int thumbCount;&lt;br /&gt;    transient private int currentIndex = 0;&lt;br /&gt;    transient private boolean isDragging;&lt;br /&gt;    transient private int[] minmaxIndices = new int[2];&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * ComponentUI Interface Implementation methods&lt;br /&gt;     */&lt;br /&gt;    public static ComponentUI createUI(JComponent b) {&lt;br /&gt;        return new MultiSliderUI();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Construct a new MultiSliderUI object.&lt;br /&gt;     */&lt;br /&gt;    public MultiSliderUI() {&lt;br /&gt;        super();&lt;br /&gt;        filledSlider = true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    int getTrackBuffer() {&lt;br /&gt;        return this.trackBuffer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Rectangle[] getThumbRects() {&lt;br /&gt;        return thumbRects;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of Thumbs.&lt;br /&gt;     */&lt;br /&gt;    public void setThumbCount(int count) {&lt;br /&gt;        this.thumbCount = count;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns the index number of the thumb currently operated.&lt;br /&gt;     */&lt;br /&gt;    protected int getCurrentIndex() {&lt;br /&gt;        return this.currentIndex;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void installUI(JComponent c) {&lt;br /&gt;        this.thumbRects = new Rectangle[this.thumbCount];&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i] = new Rectangle();        }        this.currentIndex = 0;        if (this.thumbCount &gt; 0) {&lt;br /&gt;            thumbRect = this.thumbRects[this.currentIndex];&lt;br /&gt;        }&lt;br /&gt;        super.installUI(c);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void uninstallUI(JComponent c) {&lt;br /&gt;        super.uninstallUI(c);&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i] = null;        }        this.thumbRects = null;    }    protected void installListeners(JSlider slider) {        slider.addMouseListener(trackListener);        slider.addMouseMotionListener(trackListener);        slider.addFocusListener(focusListener);        slider.addComponentListener(componentListener);        slider.addPropertyChangeListener(propertyChangeListener);        for (int i = 0; i &lt; this.thumbCount; i++) {            ((MultiSlider) slider).getModelAt(i).addChangeListener(changeListener);        }    }    protected void uninstallListeners(JSlider slider) {        slider.removeMouseListener(trackListener);        slider.removeMouseMotionListener(trackListener);        slider.removeFocusListener(focusListener);        slider.removeComponentListener(componentListener);        slider.removePropertyChangeListener(propertyChangeListener);        for (int i = 0; i &lt; this.thumbCount; i++) {            BoundedRangeModel model = ((MultiSlider) slider).getModelAt(i);            if (model != null) {                model.removeChangeListener(changeListener);            }        }    }    @Override    protected void calculateThumbSize() {        Dimension size = new Dimension(10, 15);//getThumbSize();        for (int i = 0; i &lt; this.thumbCount; i++) {            this.thumbRects[i].setSize(size.width, size.height);        }        thumbRect.setSize(size.width, size.height);    }    protected void calculateThumbLocation() {        MultiSlider slider = (MultiSlider) this.slider;        int majorTickSpacing = slider.getMajorTickSpacing();        int minorTickSpacing = slider.getMinorTickSpacing();        int tickSpacing = 0;        if (minorTickSpacing &gt; 0) {&lt;br /&gt;            tickSpacing = minorTickSpacing;&lt;br /&gt;        } else if (majorTickSpacing &gt; 0) {&lt;br /&gt;            tickSpacing = majorTickSpacing;&lt;br /&gt;        }&lt;br /&gt;        for (int i = 0; i &lt; this.thumbCount; i++) {            if (slider.getSnapToTicks()) {                int sliderValue = slider.getValueAt(i);                int snappedValue = sliderValue;                if (tickSpacing != 0) {                    // If it's not on a tick, change the value                    if ((sliderValue - slider.getMinimum()) % tickSpacing != 0) {                        float temp = (float) (sliderValue - slider.getMinimum()) / (float) tickSpacing;                        int whichTick = Math.round(temp);                        snappedValue = slider.getMinimum() + (whichTick * tickSpacing);                    }                    if (snappedValue != sliderValue) {                        slider.setValueAt(i, snappedValue);                    }                }            }            if (slider.getOrientation() == JSlider.HORIZONTAL) {                int valuePosition = xPositionForValue(slider.getValueAt(i));                this.thumbRects[i].x = valuePosition - (this.thumbRects[i].width / 2);                this.thumbRects[i].y = trackRect.y;            } else {                int valuePosition = yPositionForValue(slider.getValueAt(i));                this.thumbRects[i].x = trackRect.x;                this.thumbRects[i].y = valuePosition - (this.thumbRects[i].height / 2);            }        }    }    public void paint(Graphics g, JComponent c) {        recalculateIfInsetsChanged();        recalculateIfOrientationChanged();        Rectangle clip = g.getClipBounds();        if (slider.getPaintTrack() &amp;&amp; clip.intersects(trackRect)) {            paintTrack(g);        }        if (slider.getPaintTicks() &amp;&amp; clip.intersects(tickRect)) {            paintTicks(g);        }        if (slider.getPaintLabels() &amp;&amp; clip.intersects(labelRect)) {            paintLabels(g);        }        if (slider.hasFocus() &amp;&amp; clip.intersects(focusRect)) {            paintFocus(g);        }        // first paint unfocused thumbs.        for (int i = 0; i &lt; this.thumbCount; i++) {            if (i != this.currentIndex) {                if (clip.intersects(this.thumbRects[i])) {                    thumbRect = this.thumbRects[i];                    paintThumb(g);                }            }        }        // then paint currently focused thumb.        if (clip.intersects(this.thumbRects[this.currentIndex])) {            thumbRect = this.thumbRects[this.currentIndex];            // thumbRect.setSize(5, 5);            paintThumb(g);        }    }    public void paintThumb(Graphics g) {        //super.paintThumb(g);        Icon SAFE_HORIZ_THUMB_ICON =                UIManager.getIcon("Slider.horizontalThumbIcon");        Rectangle knobBounds = thumbRect;        g.translate(knobBounds.x, knobBounds.y);        if (slider.getOrientation() == JSlider.HORIZONTAL) {            SAFE_HORIZ_THUMB_ICON.paintIcon(slider, g, 0, -16);            //SAFE_HORIZ_THUMB_ICON.        } else {            SAFE_HORIZ_THUMB_ICON.paintIcon(slider, g, 0, 0);        }        g.translate(-knobBounds.x, -knobBounds.y);    }    public void paintTrack(Graphics g) {        //super.paintTrack(g);        Color trackColor = !slider.isEnabled() ? MetalLookAndFeel.getControlShadow()                : slider.getForeground();        boolean leftToRight = true;//MetalUtils.isLeftToRight(slider);        g.translate(trackRect.x, trackRect.y);        int trackLeft = 0;        int trackTop = 0;        int trackRight = 0;        int trackBottom = 0;        // Draw the track        if (slider.getOrientation() == JSlider.HORIZONTAL) {            trackBottom = (trackRect.height - 1) - getThumbOverhang();            trackTop = trackBottom - (getTrackWidth() - 1);            trackRight = trackRect.width - 1;        } else {            if (leftToRight) {                trackLeft = (trackRect.width - getThumbOverhang())                        - getTrackWidth();                trackRight = (trackRect.width - getThumbOverhang()) - 1;            } else {                trackLeft = getThumbOverhang();                trackRight = getThumbOverhang() + getTrackWidth() - 1;            }            trackBottom = trackRect.height - 1;        }        if (slider.isEnabled()) {            g.setColor(MetalLookAndFeel.getControlDarkShadow());            g.drawRect(trackLeft, trackTop,                    (trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1);            g.setColor(MetalLookAndFeel.getControlHighlight());            g.drawLine(trackLeft + 1, trackBottom, trackRight, trackBottom);            g.drawLine(trackRight, trackTop + 1, trackRight, trackBottom);            g.setColor(MetalLookAndFeel.getControlShadow());            g.drawLine(trackLeft + 1, trackTop + 1, trackRight - 2, trackTop + 1);            g.drawLine(trackLeft + 1, trackTop + 1, trackLeft + 1, trackBottom - 2);            g.setColor(Color.RED);            g.drawLine(trackLeft, trackTop - 3, (int) this.thumbRects[0].getX()-15, trackTop - 3);            g.setColor(Color.BLUE);            g.drawLine(trackLeft, trackTop - 6, (int) this.thumbRects[1].getX()-15, trackTop - 6);                     g.setColor(MetalLookAndFeel.getControlShadow());        } else {            g.setColor(MetalLookAndFeel.getControlShadow());            g.drawRect(trackLeft, trackTop,                    (trackRight - trackLeft) - 1, (trackBottom - trackTop) - 1);        }        // Draw the fill        if (filledSlider) {            int middleOfThumb = 0;            int fillTop = 0;            int fillLeft = 0;            int fillBottom = 0;            int fillRight = 0;            if (slider.getOrientation() == JSlider.HORIZONTAL) {                middleOfThumb = thumbRect.x + (thumbRect.width / 2);                middleOfThumb -= trackRect.x; // To compensate for the g.translate()                fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;                fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;                if (!drawInverted()) {                    fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;                    fillRight = middleOfThumb;                } else {                    fillLeft = middleOfThumb;                    fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;                }            } else {                middleOfThumb = thumbRect.y + (thumbRect.height / 2);                middleOfThumb -= trackRect.y; // To compensate for the g.translate()                fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;                fillRight = !slider.isEnabled() ? trackRight - 1 : trackRight - 2;                if (!drawInverted()) {                    fillTop = middleOfThumb;                    fillBottom = !slider.isEnabled() ? trackBottom - 1 : trackBottom - 2;                } else {                    fillTop = !slider.isEnabled() ? trackTop : trackTop + 1;                    fillBottom = middleOfThumb;                }            }            if (slider.isEnabled()) {                //   g.setColor( Color.RED);                g.drawLine(fillLeft, fillTop, fillRight, fillTop);                g.drawLine(fillLeft, fillTop, fillLeft, fillBottom);                //g.setColor( Color.green );                g.fillRect(fillLeft + 1, fillTop + 1,                        fillRight - fillLeft, fillBottom - fillTop);            } else {                g.setColor(MetalLookAndFeel.getControlShadow());                g.fillRect(fillLeft, fillTop,                        fillRight - fillLeft, trackBottom - trackTop);            }        }        g.translate(-trackRect.x, -trackRect.y);    }    public void scrollByBlock(int direction) {        synchronized (slider) {            int oldValue = ((MultiSlider) slider).getValueAt(this.currentIndex);            int blockIncrement = slider.getMaximum() / 10;            int delta = blockIncrement * ((direction &gt; 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);&lt;br /&gt;            ((MultiSlider) slider).setValueAt(this.currentIndex, oldValue + delta);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void scrollByUnit(int direction) {&lt;br /&gt;        synchronized (slider) {&lt;br /&gt;            int oldValue = ((MultiSlider) slider).getValueAt(this.currentIndex);&lt;br /&gt;            int delta = 1 * ((direction &gt; 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL);&lt;br /&gt;            ((MultiSlider) slider).setValueAt(this.currentIndex, oldValue + delta);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected TrackListener createTrackListener(JSlider slider) {&lt;br /&gt;        return new MultiTrackListener();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Track Listener Class tracks mouse movements.&lt;br /&gt;     */&lt;br /&gt;    class MultiTrackListener extends BasicSliderUI.TrackListener {&lt;br /&gt;&lt;br /&gt;        int _trackTop;&lt;br /&gt;        int _trackBottom;&lt;br /&gt;        int _trackLeft;&lt;br /&gt;        int _trackRight;&lt;br /&gt;        transient private int[] firstXY = new int[2];&lt;br /&gt;&lt;br /&gt;        /***&lt;br /&gt;         * If the mouse is pressed above the "thumb" component&lt;br /&gt;         * then reduce the scrollbars value by one page ("page up"),&lt;br /&gt;         * otherwise increase it by one page.  If there is no&lt;br /&gt;         * thumb then page up if the mouse is in the upper half&lt;br /&gt;         * of the track.&lt;br /&gt;         */&lt;br /&gt;        public void mousePressed(MouseEvent e) {&lt;br /&gt;            int[] neighbours = new int[2];&lt;br /&gt;            boolean bounded = ((MultiSlider) slider).isBounded();&lt;br /&gt;            if (!slider.isEnabled()) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            currentMouseX = e.getX();&lt;br /&gt;            currentMouseY = e.getY();&lt;br /&gt;            firstXY[0] = currentMouseX;&lt;br /&gt;            firstXY[1] = currentMouseY;&lt;br /&gt;&lt;br /&gt;            slider.requestFocus();&lt;br /&gt;            // Clicked in the Thumb area?&lt;br /&gt;            minmaxIndices[0] = -1;&lt;br /&gt;            minmaxIndices[1] = -1;&lt;br /&gt;            for (int i = 0; i &lt; MultiSliderUI.this.thumbCount; i++) {                if (MultiSliderUI.this.thumbRects[i].contains(currentMouseX, currentMouseY)) {                    if (minmaxIndices[0] == -1) {                        minmaxIndices[0] = i;                        MultiSliderUI.this.currentIndex = i;                    }                    if (minmaxIndices[1] &lt; i) {                        minmaxIndices[1] = i;                    }                    switch (slider.getOrientation()) {                        case JSlider.VERTICAL:                            offset = currentMouseY - MultiSliderUI.this.thumbRects[i].y;                            break;                        case JSlider.HORIZONTAL:                            offset = currentMouseX - MultiSliderUI.this.thumbRects[i].x;                            break;                    }                    MultiSliderUI.this.isDragging = true;                    thumbRect = MultiSliderUI.this.thumbRects[i];                    if (bounded) {                        neighbours[0] = ((i - 1) &lt; 0) ? -1 : (i - 1);                        neighbours[1] = ((i + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (i + 1);&lt;br /&gt;                        //findClosest(currentMouseX, currentMouseY, neighbours, i);&lt;br /&gt;                    } else {&lt;br /&gt;                        MultiSliderUI.this.currentIndex = i;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(i, true);&lt;br /&gt;                        neighbours[0] = -1;&lt;br /&gt;                        neighbours[1] = -1;&lt;br /&gt;                    }&lt;br /&gt;                    setThumbBounds(neighbours);&lt;br /&gt;                    //return;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if (minmaxIndices[0] &gt; -1) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            MultiSliderUI.this.currentIndex = findClosest(currentMouseX, currentMouseY, neighbours, -1);&lt;br /&gt;            thumbRect = MultiSliderUI.this.thumbRects[MultiSliderUI.this.currentIndex];&lt;br /&gt;            MultiSliderUI.this.isDragging = false;&lt;br /&gt;            ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, true);&lt;br /&gt;&lt;br /&gt;            Dimension sbSize = slider.getSize();&lt;br /&gt;            int direction = POSITIVE_SCROLL;&lt;br /&gt;&lt;br /&gt;            switch (slider.getOrientation()) {&lt;br /&gt;                case JSlider.VERTICAL:&lt;br /&gt;                    if (thumbRect.isEmpty()) {&lt;br /&gt;                        int scrollbarCenter = sbSize.height / 2;&lt;br /&gt;                        if (!drawInverted()) {&lt;br /&gt;                            direction = (currentMouseY &lt; scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        } else {                            direction = (currentMouseY &lt; scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        }                    } else {                        int thumbY = thumbRect.y;                        if (!drawInverted()) {                            direction = (currentMouseY &lt; thumbY) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        } else {                            direction = (currentMouseY &lt; thumbY) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        }                    }                    break;                case JSlider.HORIZONTAL:                    if (thumbRect.isEmpty()) {                        int scrollbarCenter = sbSize.width / 2;                        if (!drawInverted()) {                            direction = (currentMouseX &lt; scrollbarCenter) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        } else {                            direction = (currentMouseX &lt; scrollbarCenter) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        }                    } else {                        int thumbX = thumbRect.x;                        if (!drawInverted()) {                            direction = (currentMouseX &lt; thumbX) ? NEGATIVE_SCROLL : POSITIVE_SCROLL;                        } else {                            direction = (currentMouseX &lt; thumbX) ? POSITIVE_SCROLL : NEGATIVE_SCROLL;                        }                    }                    break;            }            scrollDueToClickInTrack(direction);            Rectangle r = thumbRect;            if (!r.contains(currentMouseX, currentMouseY)) {                if (shouldScroll(direction)) {                    scrollTimer.stop();                    scrollListener.setDirection(direction);                    scrollTimer.start();                }            }        }        /***         * Sets a track bound for th thumb currently operated.         */        private void setThumbBounds(int[] neighbours) {            int halfThumbWidth = thumbRect.width / 2;            int halfThumbHeight = thumbRect.height / 2;            switch (slider.getOrientation()) {                case JSlider.VERTICAL:                    _trackTop = (neighbours[1] == -1) ? trackRect.y : MultiSliderUI.this.thumbRects[neighbours[1]].y + halfThumbHeight;                    _trackBottom = (neighbours[0] == -1) ? trackRect.y + (trackRect.height - 1) : MultiSliderUI.this.thumbRects[neighbours[0]].y + halfThumbHeight;                    break;                case JSlider.HORIZONTAL:                    _trackLeft = (neighbours[0] == -1) ? trackRect.x : MultiSliderUI.this.thumbRects[neighbours[0]].x + halfThumbWidth;                    _trackRight = (neighbours[1] == -1) ? trackRect.x + (trackRect.width - 1) : MultiSliderUI.this.thumbRects[neighbours[1]].x + halfThumbWidth;                    break;            }        }        /*         * this is a very lazy way to find the closest.  One might want to         * implement a much faster algorithm.         */        private int findClosest(int x, int y, int[] neighbours, int excluded) {            int orientation = slider.getOrientation();            int rightmin = Integer.MAX_VALUE; // for dxw, dy            int leftmin = -Integer.MAX_VALUE; // for dx, dyh            int dx = 0;            int dxw = 0;            int dy = 0;            int dyh = 0;            neighbours[0] = -1; // left            neighbours[1] = -1; // right            for (int i = 0; i &lt; MultiSliderUI.this.thumbCount; i++) {                if (i == excluded) {                    continue;                }                switch (orientation) {                    case JSlider.VERTICAL:                        dy = MultiSliderUI.this.thumbRects[i].y - y;                        dyh = (MultiSliderUI.this.thumbRects[i].y + MultiSliderUI.this.thumbRects[i].height) - y;                        if (dyh &lt;= 0) {                            if (dyh &gt; leftmin) { // has to be &gt; and not &gt;=&lt;br /&gt;                                leftmin = dyh;&lt;br /&gt;                                neighbours[0] = i;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        if (dy &gt;= 0) {&lt;br /&gt;                            if (dy &lt;= rightmin) {                                rightmin = dy;                                neighbours[1] = i;                            }                        }                        break;                    case JSlider.HORIZONTAL:                        dx = MultiSliderUI.this.thumbRects[i].x - x;                        dxw = (MultiSliderUI.this.thumbRects[i].x + MultiSliderUI.this.thumbRects[i].width) - x;                        if (dxw &lt;= 0) {                            if (dxw &gt;= leftmin) {&lt;br /&gt;                                leftmin = dxw;&lt;br /&gt;                                neighbours[0] = i;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        if (dx &gt;= 0) {&lt;br /&gt;                            if (dx &lt; rightmin) { // has to be &lt; and not &lt;=                                rightmin = dx;                                neighbours[1] = i;                            }                        }                        break;                }            }            //System.out.println("neighbours = " + neighbours[0] + ", " + neighbours[1]);            int closest = (Math.abs(leftmin) &lt;= Math.abs(rightmin)) ? neighbours[0] : neighbours[1];            return (closest == -1) ? 0 : closest;        }        /***         * Set the models value to the position of the top/left         * of the thumb relative to the origin of the track.         */        public void mouseDragged(MouseEvent e) {            ((MultiSlider) MultiSliderUI.this.slider).setValueBeforeStateChange(((MultiSlider) MultiSliderUI.this.slider).getValueAt(MultiSliderUI.this.currentIndex));            int thumbMiddle = 0;            boolean bounded = ((MultiSlider) slider).isBounded();            if (!slider.isEnabled()) {                return;            }            currentMouseX = e.getX();            currentMouseY = e.getY();            if (!MultiSliderUI.this.isDragging) {                return;            }            switch (slider.getOrientation()) {                case JSlider.VERTICAL:                    int halfThumbHeight = thumbRect.height / 2;                    int thumbTop = e.getY() - offset;                    if (bounded) {                        int[] neighbours = new int[2];                        int idx = -1;                        int diff = e.getY() - firstXY[1];                        //System.out.println("diff = " + diff);                        if (e.getY() - firstXY[1] &gt; 0) {&lt;br /&gt;                            idx = minmaxIndices[0];&lt;br /&gt;                        } else {&lt;br /&gt;                            idx = minmaxIndices[1];&lt;br /&gt;                        }&lt;br /&gt;                        minmaxIndices[0] = minmaxIndices[1] = idx;&lt;br /&gt;                        //System.out.println("idx = " + idx);&lt;br /&gt;                        if (idx == -1) {&lt;br /&gt;                            break;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        //System.out.println("thumbTop = " + thumbTop);&lt;br /&gt;                        neighbours[0] = ((idx - 1) &lt; 0) ? -1 : (idx - 1);                        neighbours[1] = ((idx + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (idx + 1);&lt;br /&gt;                        thumbRect = MultiSliderUI.this.thumbRects[idx];&lt;br /&gt;                        MultiSliderUI.this.currentIndex = idx;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(idx, true);&lt;br /&gt;                        setThumbBounds(neighbours);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    thumbTop = Math.max(thumbTop, _trackTop - halfThumbHeight);&lt;br /&gt;                    thumbTop = Math.min(thumbTop, _trackBottom - halfThumbHeight);&lt;br /&gt;&lt;br /&gt;                    setThumbLocation(thumbRect.x, thumbTop);&lt;br /&gt;&lt;br /&gt;                    thumbMiddle = thumbTop + halfThumbHeight;&lt;br /&gt;                    ((MultiSlider) slider).setValueAt(MultiSliderUI.this.currentIndex, valueForYPosition(thumbMiddle));&lt;br /&gt;                    break;&lt;br /&gt;                case JSlider.HORIZONTAL:&lt;br /&gt;                    int halfThumbWidth = thumbRect.width / 2;&lt;br /&gt;                    int thumbLeft = e.getX() - offset;&lt;br /&gt;                    if (bounded) {&lt;br /&gt;                        int[] neighbours = new int[2];&lt;br /&gt;                        int idx = -1;&lt;br /&gt;                        if (e.getX() - firstXY[0] &lt;= 0) {                            idx = minmaxIndices[0];                        } else {                            idx = minmaxIndices[1];                        }                        minmaxIndices[0] = minmaxIndices[1] = idx;                        //System.out.println("idx = " + idx);                        if (idx == -1) {                            break;                        }                        //System.out.println("thumbLeft = " + thumbLeft);                        neighbours[0] = ((idx - 1) &lt; 0) ? -1 : (idx - 1);                        neighbours[1] = ((idx + 1) &gt;= MultiSliderUI.this.thumbCount) ? -1 : (idx + 1);&lt;br /&gt;                        thumbRect = MultiSliderUI.this.thumbRects[idx];&lt;br /&gt;                        MultiSliderUI.this.currentIndex = idx;&lt;br /&gt;                        ((MultiSlider) slider).setValueIsAdjustingAt(idx, true);&lt;br /&gt;                        setThumbBounds(neighbours);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    thumbLeft = Math.max(thumbLeft, _trackLeft - halfThumbWidth);&lt;br /&gt;                    thumbLeft = Math.min(thumbLeft, _trackRight - halfThumbWidth);&lt;br /&gt;&lt;br /&gt;                    setThumbLocation(thumbLeft, thumbRect.y);&lt;br /&gt;&lt;br /&gt;                    thumbMiddle = thumbLeft + halfThumbWidth;&lt;br /&gt;&lt;br /&gt;                    ((MultiSlider) slider).setValueAt(MultiSliderUI.this.currentIndex, valueForXPosition(thumbMiddle));&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    return;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void mouseReleased(MouseEvent e) {&lt;br /&gt;            if (!slider.isEnabled()) {&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            offset = 0;&lt;br /&gt;            scrollTimer.stop();&lt;br /&gt;&lt;br /&gt;            if (slider.getSnapToTicks()) {&lt;br /&gt;                MultiSliderUI.this.isDragging = false;&lt;br /&gt;                ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, false);&lt;br /&gt;            } else {&lt;br /&gt;                ((MultiSlider) slider).setValueIsAdjustingAt(MultiSliderUI.this.currentIndex, false);&lt;br /&gt;                MultiSliderUI.this.isDragging = false;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            slider.repaint();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * A static version of the above.&lt;br /&gt;     */&lt;br /&gt;    static class SharedActionScroller extends AbstractAction {&lt;br /&gt;&lt;br /&gt;        int _dir;&lt;br /&gt;        boolean _block;&lt;br /&gt;&lt;br /&gt;        public SharedActionScroller(int dir, boolean block) {&lt;br /&gt;            _dir = dir;&lt;br /&gt;            _block = block;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void actionPerformed(ActionEvent e) {&lt;br /&gt;            JSlider slider = (JSlider) e.getSource();&lt;br /&gt;            MultiSliderUI ui = (MultiSliderUI) slider.getUI();&lt;br /&gt;            if (_dir == NEGATIVE_SCROLL || _dir == POSITIVE_SCROLL) {&lt;br /&gt;                int realDir = _dir;&lt;br /&gt;                if (slider.getInverted()) {&lt;br /&gt;                    realDir = _dir == NEGATIVE_SCROLL ? POSITIVE_SCROLL : NEGATIVE_SCROLL;&lt;br /&gt;                }&lt;br /&gt;                if (_block) {&lt;br /&gt;                    ui.scrollByBlock(realDir);&lt;br /&gt;                } else {&lt;br /&gt;                    ui.scrollByUnit(realDir);&lt;br /&gt;                }&lt;br /&gt;            } else {&lt;br /&gt;                if (slider.getInverted()) {&lt;br /&gt;                    if (_dir == MIN_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMaximum());&lt;br /&gt;                    } else if (_dir == MAX_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMinimum());&lt;br /&gt;                    }&lt;br /&gt;                } else {&lt;br /&gt;                    if (_dir == MIN_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMinimum());&lt;br /&gt;                    } else if (_dir == MAX_SCROLL) {&lt;br /&gt;                        ((MultiSlider) slider).setValueAt(ui.currentIndex,&lt;br /&gt;                                slider.getMaximum());&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8356607320505232977-2830179323495742033?l=chetanmenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/2830179323495742033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8356607320505232977&amp;postID=2830179323495742033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/2830179323495742033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/2830179323495742033'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/2010/05/multisliderui.html' title='MultiSliderUI'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8356607320505232977.post-4325543440099035689</id><published>2010-05-28T04:43:00.000-07:00</published><updated>2010-05-28T04:43:13.765-07:00</updated><title type='text'>MultiSlider</title><content type='html'>/*&lt;br /&gt; * To change this template, choose Tools | Templates&lt;br /&gt; * and open the template in the editor.&lt;br /&gt; */&lt;br /&gt;package CUSTOMCOMPONENT.jslider;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Chetan Menge &lt;chetan.menge@mettleconsulting.co.in&gt;&lt;br /&gt; * Copyright : USIT&lt;br /&gt; */&lt;br /&gt;/* -------------------------------------------------------------------&lt;br /&gt; * GeoVISTA Center (Penn State, Dept. of Geography)&lt;br /&gt; *&lt;br /&gt; * Java source file for the class MultiSlider&lt;br /&gt; *&lt;br /&gt; * Copyright (c), 1999 - 2002, Masahiro Takatsuka and GeoVISTA Center&lt;br /&gt; * All Rights Researved.&lt;br /&gt; *&lt;br /&gt; * Original Author: Masahiro Takatsuka&lt;br /&gt; * $Author: eytanadar $&lt;br /&gt; *&lt;br /&gt; * $Date: 2005/10/05 20:19:52 $&lt;br /&gt; *&lt;br /&gt; *&lt;br /&gt; * Reference:  Document no:&lt;br /&gt; * ___    ___&lt;br /&gt; *&lt;br /&gt; * To Do:&lt;br /&gt; * ___&lt;br /&gt; *&lt;br /&gt;------------------------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;/* --------------------------- Package ---------------------------- */&lt;br /&gt;import java.awt.*;&lt;br /&gt;import javax.accessibility.*;&lt;br /&gt;import javax.swing.*;&lt;br /&gt;import javax.swing.plaf.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*====================================================================&lt;br /&gt;Implementation of class MultiSlider&lt;br /&gt;====================================================================*/&lt;br /&gt;/***&lt;br /&gt; * A component that lets the user graphically select values by slding&lt;br /&gt; * multiple thumbs within a bounded interval. MultiSlider inherits all&lt;br /&gt; * fields and methods from javax.swing.JSlider.&lt;br /&gt; * &lt;p&gt; *&lt;br /&gt; * @version $Revision: 1.1 $&lt;br /&gt; * @author Masahiro Takatsuka (masa@jbeans.net)&lt;br /&gt; * @see JSlider&lt;br /&gt; */&lt;br /&gt;public class MultiSlider extends JSlider {&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * @see #getUIClassID&lt;br /&gt;     * @see #readObject&lt;br /&gt;     */&lt;br /&gt;    private static final String uiClassID = "MultiSliderUI";&lt;br /&gt;    /***&lt;br /&gt;     * An array of data models that handle the numeric maximum values,&lt;br /&gt;     * minimum values, and current-position values for the multi slider.&lt;br /&gt;     */&lt;br /&gt;    private BoundedRangeModel[] sliderModels;&lt;br /&gt;    /***&lt;br /&gt;     * If it is true, a thumb is bounded by adjacent thumbs.&lt;br /&gt;     */&lt;br /&gt;    private boolean bounded = false;&lt;br /&gt;    /***&lt;br /&gt;     * This is a color to paint the current thumb&lt;br /&gt;     */&lt;br /&gt;    private Color currentThumbColor = Color.red;&lt;br /&gt;    /***&lt;br /&gt;     * this flag is used to create default anchors.&lt;br /&gt;     */&lt;br /&gt;    transient private boolean useEndPoints = false;&lt;br /&gt;    transient private int valueBeforeStateChange;&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider with the specified orientation and the&lt;br /&gt;     * specified mimimum, maximum, and initial values.&lt;br /&gt;     *&lt;br /&gt;     * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL&lt;br /&gt;     *&lt;br /&gt;     * @see #setOrientation&lt;br /&gt;     * @see #setMinimum&lt;br /&gt;     * @see #setMaximum&lt;br /&gt;     * @see #setValue&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation, int min, int max,&lt;br /&gt;            int val1, int val2) {&lt;br /&gt;        checkOrientation(orientation);&lt;br /&gt;        this.orientation = orientation;&lt;br /&gt;        setNumberOfThumbs(min, max, new int[]{val1, val2});&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider with the specified orientation and the&lt;br /&gt;     * specified mimimum, maximum, and the number of thumbs.&lt;br /&gt;     *&lt;br /&gt;     * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL&lt;br /&gt;     *&lt;br /&gt;     * @see #setOrientation&lt;br /&gt;     * @see #setMinimum&lt;br /&gt;     * @see #setMaximum&lt;br /&gt;     * @see #setValue&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation, int min, int max) {&lt;br /&gt;        checkOrientation(orientation);&lt;br /&gt;        this.orientation = orientation;&lt;br /&gt;        setNumberOfThumbs(min, max, 2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a horizontal slider with the range 0 to 100 and&lt;br /&gt;     * an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider() {&lt;br /&gt;        this(HORIZONTAL, 0, 100);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a slider using the specified orientation with the&lt;br /&gt;     * range 0 to 100 and an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int orientation) {&lt;br /&gt;        this(orientation, 0, 100);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Creates a horizontal slider using the specified min and max&lt;br /&gt;     * with an intitial value of 50.&lt;br /&gt;     */&lt;br /&gt;    public MultiSlider(int min, int max) {&lt;br /&gt;        this(HORIZONTAL, min, max);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setCurrentThumbColor(Color c) {&lt;br /&gt;        this.currentThumbColor = c;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Color getCurrentThumbColor() {&lt;br /&gt;        return this.currentThumbColor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getTrackBuffer() {&lt;br /&gt;        return ((MultiSliderUI) this.ui).getTrackBuffer();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Validates the orientation parameter.&lt;br /&gt;     */&lt;br /&gt;    private void checkOrientation(int orientation) {&lt;br /&gt;        switch (orientation) {&lt;br /&gt;            case VERTICAL:&lt;br /&gt;            case HORIZONTAL:&lt;br /&gt;                break;&lt;br /&gt;            default:&lt;br /&gt;                throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Notification from the UIFactory that the L&amp;F has changed.&lt;br /&gt;     * Called to replace the UI with the latest version from the&lt;br /&gt;     * default UIFactory.&lt;br /&gt;     *&lt;br /&gt;     * @see JComponent#updateUI&lt;br /&gt;     */&lt;br /&gt;    public void updateUI() {&lt;br /&gt;        updateLabelUIs();&lt;br /&gt;        MultiSliderUI ui = new MultiSliderUI();&lt;br /&gt;        if (this.sliderModels != null) {&lt;br /&gt;            ui.setThumbCount(this.sliderModels.length);&lt;br /&gt;        }&lt;br /&gt;        setUI((SliderUI) ui);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns the number of thumbs in the slider.&lt;br /&gt;     */&lt;br /&gt;    public int getNumberOfThumbs() {&lt;br /&gt;        return this.sliderModels.length;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int num, boolean useEndPoints) {&lt;br /&gt;        int[] values = createDefaultValues(min, max, num, useEndPoints);&lt;br /&gt;        setNumberOfThumbs(min, max, values);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int num) {&lt;br /&gt;        setNumberOfThumbs(min, max, num, false);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the number of thumbs with the specified parameters.&lt;br /&gt;     */&lt;br /&gt;    private void setNumberOfThumbs(int min, int max, int[] values) {&lt;br /&gt;        if (values == null || values.length &lt; 1) {            values = new int[]{50};        }        int num = values.length;        this.sliderModels = new BoundedRangeModel[num];        for (int i = 0; i &lt; num; i++) {            this.sliderModels[i] = new DefaultBoundedRangeModel(values[i], 0, min, max);            this.sliderModels[i].addChangeListener(changeListener);        }        updateUI();    }    /***     * Sets the number of thumbs.     */    private void setNumberOfThumbs(int num) {        setNumberOfThumbs(num, false);    }    /***     * Sets the number of thumbs.     */    private void setNumberOfThumbs(int num, boolean useEndPoints) {        if (getNumberOfThumbs() != num) {            setNumberOfThumbs(getMinimum(), getMaximum(), num, useEndPoints);        }    }    /***     * Sets the number of thumbs by specifying the initial values.     */    private void setNumberOfThumbs(int[] values) {        setNumberOfThumbs(getMinimum(), getMaximum(), values);    }    /***     * creates evenly spaced values for thumbs.     */    private int[] createDefaultValues(int min, int max, int num_of_values, boolean useEndPoints) {        int[] values = new int[num_of_values];        int range = max - min;        if (!useEndPoints) {            int step = range / (num_of_values + 1);            for (int i = 0; i &lt; num_of_values; i++) {                values[i] = min + (i + 1) * step;            }        } else {            if (num_of_values &lt; 1) {                return new int[0];            }            values[0] = getMinimum();            values[num_of_values - 1] = getMaximum();            int[] def = createDefaultValues(getMinimum(), getMaximum(), num_of_values - 2, false);            for (int i = 0; i &lt; def.length; i++) {                values[i + 1] = def[i];            }        }        return values;    }    /***     * Returns the index number of currently operated thumb.     */    public int getCurrentThumbIndex() {        return ((MultiSliderUI) ui).getCurrentIndex();    }    /***     * Returns data model that handles the sliders three     * fundamental properties: minimum, maximum, value.     *     * @see #setModel     */    public BoundedRangeModel getModel() {        return getModelAt(getCurrentThumbIndex());    }    /***     * Returns data model that handles the sliders three     * fundamental properties: minimum, maximum, value.     *     * @see #setModel     */    public BoundedRangeModel getModelAt(int index) {        if (this.sliderModels == null || index &gt;= this.sliderModels.length) {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        return this.sliderModels[index];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns data model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #setModel&lt;br /&gt;     */&lt;br /&gt;    public BoundedRangeModel[] getModels() {&lt;br /&gt;        return this.sliderModels;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #getModel&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     * description: The sliders BoundedRangeModel.&lt;br /&gt;     */&lt;br /&gt;    public void setModel(BoundedRangeModel newModel) {&lt;br /&gt;        setModelAt(getCurrentThumbIndex(), newModel);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the model that handles the sliders three&lt;br /&gt;     * fundamental properties: minimum, maximum, value.&lt;br /&gt;     *&lt;br /&gt;     * @see #getModel&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     * description: The sliders BoundedRangeModel.&lt;br /&gt;     */&lt;br /&gt;    public void setModelAt(int index, BoundedRangeModel newModel) {&lt;br /&gt;        BoundedRangeModel oldModel = getModelAt(index);&lt;br /&gt;&lt;br /&gt;        if (oldModel != null) {&lt;br /&gt;            oldModel.removeChangeListener(changeListener);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        this.sliderModels[index] = newModel;&lt;br /&gt;&lt;br /&gt;        if (newModel != null) {&lt;br /&gt;            newModel.addChangeListener(changeListener);&lt;br /&gt;&lt;br /&gt;            if (accessibleContext != null) {&lt;br /&gt;                accessibleContext.firePropertyChange(&lt;br /&gt;                        AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,&lt;br /&gt;                        (oldModel == null&lt;br /&gt;                        ? null : new Integer(oldModel.getValue())),&lt;br /&gt;                        (newModel == null&lt;br /&gt;                        ? null : new Integer(newModel.getValue())));&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        firePropertyChange("model", oldModel, this.sliderModels[index]);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Sets the models minimum property.&lt;br /&gt;     *&lt;br /&gt;     * @see #getMinimum&lt;br /&gt;     * @see BoundedRangeModel#setMinimum&lt;br /&gt;     * @beaninfo&lt;br /&gt;     *       bound: true&lt;br /&gt;     *   preferred: true&lt;br /&gt;     * description: The sliders minimum value.&lt;br /&gt;     */&lt;br /&gt;    public void setMinimum(int minimum) {&lt;br /&gt;        int count = getNumberOfThumbs();&lt;br /&gt;        int oldMin = getModel().getMinimum();&lt;br /&gt;        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setMinimum(minimum);        }        firePropertyChange("minimum", new Integer(oldMin), new Integer(minimum));    }    /***     * Sets the models maximum property.     *     * @see #getMaximum     * @see BoundedRangeModel#setMaximum     * @beaninfo     *       bound: true     *   preferred: true     * description: The sliders maximum value.     */    public void setMaximum(int maximum) {        int count = getNumberOfThumbs();        int oldMax = getModel().getMaximum();        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setMaximum(maximum);        }        firePropertyChange("maximum", new Integer(oldMax), new Integer(maximum));    }    /***     * Returns the sliders value.     * @return the models value property     * @see #setValue     */    public int getValue() {        return getValueAt(getCurrentThumbIndex());    }    /***     * Returns the sliders value.     * @return the models value property     * @see #setValue     */    public int getValueAt(int index) {        return getModelAt(index).getValue();    }    /***     * Sets the sliders current value.  This method just forwards     * the value to the model.     *     * @see #getValue     * @beaninfo     *   preferred: true     * description: The sliders current value.     */    public void setValue(int n) {        setValueAt(getCurrentThumbIndex(), n);    }    /***     * Sets the sliders current value.  This method just forwards     * the value to the model.     *     * @see #getValue     * @beaninfo     *   preferred: true     * description: The sliders current value.     */    public void setValueAt(int index, int n) {        BoundedRangeModel m = getModelAt(index);        int oldValue = m.getValue();        m.setValue(n);        if (accessibleContext != null) {            accessibleContext.firePropertyChange(                    AccessibleContext.ACCESSIBLE_VALUE_PROPERTY,                    new Integer(oldValue),                    new Integer(m.getValue()));        }    }    /***     * True if the slider knob is being dragged.     *     * @return the value of the models valueIsAdjusting property     * @see #setValueIsAdjusting     */    public boolean getValueIsAdjusting() {        boolean result = false;        int count = getNumberOfThumbs();        for (int i = 0; i &lt; count; i++) {            result = (result || getValueIsAdjustingAt(i));        }        return result;    }    /***     * True if the slider knob is being dragged.     */    public boolean getValueIsAdjustingAt(int index) {        return getModelAt(index).getValueIsAdjusting();    }    /***     * Sets the models valueIsAdjusting property.  Slider look and     * feel implementations should set this property to true when     * a knob drag begins, and to false when the drag ends.  The     * slider model will not generate ChangeEvents while     * valueIsAdjusting is true.     *     * @see #getValueIsAdjusting     * @see BoundedRangeModel#setValueIsAdjusting     * @beaninfo     *      expert: true     * description: True if the slider knob is being dragged.     */    public void setValueIsAdjusting(boolean b) {        setValueIsAdjustingAt(getCurrentThumbIndex(), b);    }    /***     * Sets the models valueIsAdjusting property.  Slider look and     * feel implementations should set this property to true when     * a knob drag begins, and to false when the drag ends.  The     * slider model will not generate ChangeEvents while     * valueIsAdjusting is true.     */    public void setValueIsAdjustingAt(int index, boolean b) {        BoundedRangeModel m = getModelAt(index);        boolean oldValue = m.getValueIsAdjusting();        m.setValueIsAdjusting(b);        if ((oldValue != b) &amp;&amp; (accessibleContext != null)) {            accessibleContext.firePropertyChange(                    AccessibleContext.ACCESSIBLE_STATE_PROPERTY,                    ((oldValue) ? AccessibleState.BUSY : null),                    ((b) ? AccessibleState.BUSY : null));        }    }    /***     * Sets the size of the range "covered" by the knob.  Most look     * and feel implementations will change the value by this amount     * if the user clicks on either side of the knob.     *     * @see #getExtent     * @see BoundedRangeModel#setExtent     * @beaninfo     *      expert: true     * description: Size of the range covered by the knob.     */    public void setExtent(int extent) {        int count = getNumberOfThumbs();        for (int i = 0; i &lt; count; i++) {            getModelAt(i).setExtent(extent);        }    }    /***     * Sets a bounded attribute of a slider thumb.     * &lt;PRE&gt;&lt;br /&gt;&lt;br /&gt;     * &lt;/PRE&gt;     *&lt;br /&gt;     * @param b&lt;br /&gt;     * @return void&lt;br /&gt;     */&lt;br /&gt;    public void setBounded(boolean b) {&lt;br /&gt;        this.bounded = b;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /***&lt;br /&gt;     * Returns a bounded attribute of a slider thumb.&lt;br /&gt;     * &lt;PRE&gt;     * &lt;/PRE&gt;     *&lt;br /&gt;     * @return boolean&lt;br /&gt;     */&lt;br /&gt;    public boolean isBounded() {&lt;br /&gt;        return this.bounded;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getValueBeforeStateChange() {&lt;br /&gt;        return this.valueBeforeStateChange;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void setValueBeforeStateChange(int v) {&lt;br /&gt;        this.valueBeforeStateChange = v;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;        public void drawLine(Graphics g, Point orgn, Point dest,Color c,int sub) {&lt;br /&gt;        g.setColor(c);&lt;br /&gt;        g.drawLine((int) 21, (int) orgn.getY()-sub, (int) dest.getX(), (int) dest.getY()-sub);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8356607320505232977-4325543440099035689?l=chetanmenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/4325543440099035689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8356607320505232977&amp;postID=4325543440099035689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/4325543440099035689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/4325543440099035689'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/2010/05/multislider.html' title='MultiSlider'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8356607320505232977.post-7959317334399408254</id><published>2009-12-22T20:41:00.000-08:00</published><updated>2010-01-06T20:03:43.591-08:00</updated><title type='text'>JAVA INTERVIEW QUESTIONS</title><content type='html'>&lt;span style="font-weight:bold;"&gt;COMPANY:- ORACLE ( PUNE ) ( 19 Dec 09 )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1.Explain about ur userself&lt;br /&gt;2.What is normalization ? which normalization did us use?&lt;br /&gt;3.what is clonning?how will u implement it ?types of it?&lt;br /&gt;4.what is  String , StringBufferr And StingBuilder ? what is diff?&lt;br /&gt;5.Suppose i want to override nay methode of String Class, How I can acheive  it ?&lt;br /&gt;6.What is serialization? write a code for it?&lt;br /&gt;7.what is externlization?&lt;br /&gt;8.what is interface ?Abstract class? Where u have used it? with example?&lt;br /&gt;9.What is difference in Struts different version ?1.0,1.1,1.2?&lt;br /&gt;10.Inner class?annonYmus inner class? where u have used it?&lt;br /&gt;11.What is diffrence between java.util.Date and java.sql.Date?&lt;br /&gt;12.How to make class immutable?&lt;br /&gt;13.What is Statement ,PreparedStament and callabelStatement?&lt;br /&gt;14.Where PrepareStatement Queries are compiled JVM ore database?&lt;br /&gt;15.What is annotations?where u have used it?&lt;br /&gt;16.What are differnt DesignPatterns? Which pattern do you Know?Do you ever used them?&lt;br /&gt;17.lifecyle of servlet? can i define constructor in my Servlet?&lt;br /&gt;18.abstaract factory pattern class?&lt;br /&gt;19.what is useBean tag in jsp ?what are the different scope values for it?&lt;br /&gt;20.how many table where there in your project?&lt;br /&gt;21.Did u design project database? which  normalization  u used?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;COMPANY:- Cognizant 28th. Nov&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Draw the Complete flow diagram of struts project. what is ActionServlet, RequestProcessor, ActionForm.&lt;br /&gt;How to enable/disable validator framework. what are the configuration files?&lt;br /&gt;Struts does client side or server side validation ? How?. What are struts custom tag libs... what are they used for?&lt;br /&gt;How to apply validator in forms. How to check duplicate request if user clicks the submit button twice&lt;br /&gt;(hint: isValidToken() method)? and how to set a token on the JSP.&lt;br /&gt;&lt;br /&gt;What is DAO. How can you make a class singlton. Difference between SessionFacade and BusinessDeligate.&lt;br /&gt;What does ServiceLocator do. Why ValueObjects ?&lt;br /&gt;&lt;br /&gt;MessageDrivenBean?&lt;br /&gt;&lt;br /&gt;Methods of Object class, Marker interfaces, Serialization, Sorting a Collection, Comparator and Comparable interfaces.&lt;br /&gt;&lt;br /&gt;Database joins, Difference between Statement, PreparedStatement and CallableStatement.&lt;br /&gt; &lt;br /&gt;What are Jsp directives, implicit objects, RequestDispatcher. Diff between Forward and SendRedirect.&lt;br /&gt;User statement mgmt (cookies, url rewriting, session object, hidden form field).&lt;br /&gt;&lt;br /&gt;What are the interfaces in Collection framework (hierarchy). Synchronized method and block. Job Schedular classes in java.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; Sugen Software(6 Jan 2010)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1) Tell me about yourself?&lt;br /&gt;2) Describe about ZK?&lt;br /&gt;3) As you told using zk look and feel like desktop application,then tell me diff between swing and zk?&lt;br /&gt;4) Project Description in brief?&lt;br /&gt;5) How many tables in your project?&lt;br /&gt;6) Data base structure and logical implementation of some part of project?&lt;br /&gt;7) What are the OOPs concepts in brief?&lt;br /&gt;8) What is mean by interface?&lt;br /&gt;9) Diff between interface and abstarct class?&lt;br /&gt;10) Tell me diff between final class,method and variable.&lt;br /&gt;11) Diff between shadow and deep cloning object.&lt;br /&gt;12) Rating for the Hibernate out of 5?&lt;br /&gt;13) Why we declare Session factory class as a final?&lt;br /&gt;14) What is mean by procedure,cursor and trigger?How to use it?&lt;br /&gt;15) What is join and types of join?Explain left outer join?&lt;br /&gt;16) Write a prog. for accessing member of class without creating object?&lt;br /&gt;17) What is overloading and overridding with example?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8356607320505232977-7959317334399408254?l=chetanmenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/7959317334399408254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8356607320505232977&amp;postID=7959317334399408254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/7959317334399408254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/7959317334399408254'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/2009/12/java-interview-qestions.html' title='JAVA INTERVIEW QUESTIONS'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8356607320505232977.post-8947172367240668884</id><published>2009-05-07T04:35:00.000-07:00</published><updated>2009-07-21T21:59:40.691-07:00</updated><title type='text'>SMS sending through WEB application</title><content type='html'>Send and Receive SMS through Web Application&lt;br /&gt;&lt;br /&gt;There are two ways to achieve this&lt;br /&gt;1. By using mobile (GSM) device connected to pc.&lt;br /&gt;2. By using SMS gateway provider(http://www.developershome.com/sms/sms_tutorial.asp?page=smsGateway).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using sms gateway provider&lt;br /&gt;&lt;br /&gt;how to select the sms gateway provider&lt;br /&gt;&lt;br /&gt;http://www.developershome.com/sms/howToChooseSMSGateway.asp&lt;br /&gt;&lt;br /&gt;e.g of sms gateway provider&lt;br /&gt;1.https://www.clickatell.com/&lt;br /&gt;2.http://www.textmarks.com/dev/docs/recv/?ref=devsb&lt;br /&gt;&lt;br /&gt;There needs an api which connects the web application to the sms gateway provider. The api is depdends upon the gateway provider.&lt;br /&gt;&lt;br /&gt;The sms is sended/ received   to/from the gateway provider by diffrent method&lt;br /&gt;such as,&lt;br /&gt;   http, smpp, xml, smtp. that are used by the api.&lt;br /&gt;e.g.&lt;br /&gt;https://www.clickatell.com/developers/api_http.php&lt;br /&gt;&lt;br /&gt;For demo of sending sms register and provider they provide an api to connect with them to send sms&lt;br /&gt;&lt;br /&gt;Following is java prog to test sms sending using clickatell as provider&lt;br /&gt;&lt;br /&gt;the prog use smsj.jar and slf4j-api-1.3.1.jar&lt;br /&gt;&lt;br /&gt;import org.marre.SmsSender;&lt;br /&gt;import org.marre.sms.SmsMessage;&lt;br /&gt;import org.marre.sms.SmsPdu;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class smsSend {&lt;br /&gt;&lt;br /&gt;public  static void  main(String args[]){&lt;br /&gt;       try&lt;br /&gt;       {&lt;br /&gt;       // Send SMS with clickatell&lt;br /&gt;    SmsSender smsSender = SmsSender.getClickatellSender("username", "passwd", "sys_id");&lt;br /&gt;    String msg = "A sample SMS.";&lt;br /&gt;    // International number to reciever without leading "+"&lt;br /&gt;    String reciever = "98*********";&lt;br /&gt;    // Number of sender (not supported on all transports)&lt;br /&gt;    String sender = "98******";&lt;br /&gt;    // Connect&lt;br /&gt;   smsSender.connect();&lt;br /&gt; smsSender.disconnect();&lt;br /&gt;&lt;br /&gt;   }catch(Exception e){&lt;br /&gt;           System.out.println("the Exception is ====="+e);&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;*************************************************&lt;br /&gt;Using gsm connected(Mobile Device) to pc to send and receive sms&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Can be done by using kannel as intermediator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;**************************************************&lt;br /&gt;&lt;br /&gt;Using Kannel (Sms gateway ) to send and receive sms by SMS service provider and gsm modem connected to system.&lt;br /&gt;&lt;br /&gt;You can install kannel by two ways &lt;br /&gt;&lt;br /&gt;1. By using &lt;br /&gt;&lt;br /&gt;sudo apt-get install kannel&lt;br /&gt;&lt;br /&gt;2. And in second method by downloading the tar.gz and compiling it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1 - Satisfying requirements / dependencies for kannel&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Build dependencies:&lt;br /&gt;&lt;br /&gt;Install build tools (gcc, mac, g++, etc. Not all necessary but you should have them!)&lt;br /&gt;&lt;br /&gt;    * sudo apt-get install build-essential&lt;br /&gt;&lt;br /&gt;Install required Kannel dependencies (there are obviously way more, but this is all required on Kubuntu 8.04)&lt;br /&gt;&lt;br /&gt;    * sudo apt-get install libxml2-dev&lt;br /&gt;&lt;br /&gt;Install optional Kannel dependencies (These are only required if you would like to use SSL enabled servers, alternate DLR storage options etc. For the purposes of this example I will enable our Kannel build for SSL and PostgreSQL DLR storage)&lt;br /&gt;&lt;br /&gt;    * sudo apt-get install openssl-dev&lt;br /&gt;    * sudo apt-get install libpq-dev&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Step 2 - Getting the source of Kannel.&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Option a) Downloading latest stable&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Visit the &lt;a href="http://www.kannel.org/download.shtml"&gt;kannel download page&lt;/a&gt; and download the source as gzip tarball (or bzip2 tarball if you prefer). In the directory you downloaded execute:&lt;/p&gt;&lt;p&gt;I chose to install to &lt;code&gt;/usr/local/kannel&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# mkdir src&lt;br /&gt;# cd src&lt;br /&gt;# tar xfz ../downloads/gateway-1.4.1.tar.gz&lt;br /&gt;# cd gateway-1.4.1&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Step 3 - Building Kannel&lt;br /&gt;&lt;br /&gt;Change directory to the directory you downloaded the source to (gateway-X.X.X or gateway-cvs)&lt;br /&gt;&lt;br /&gt;Execute:&lt;br /&gt;&lt;br /&gt;    * ./configure&lt;br /&gt;&lt;br /&gt;This should configure the build correctly with OpenSSL and PostgreSQL support.&lt;br /&gt;&lt;br /&gt;if make is not install then install it by using&lt;br /&gt;&lt;br /&gt;* sudo apt-get install make&lt;br /&gt;&lt;br /&gt;Once that’s done, execute:&lt;br /&gt;&lt;br /&gt;    * make&lt;br /&gt;&lt;br /&gt;This will build the binaries for Kannel, if you want to install them system wide at this point you can by executing:&lt;br /&gt;&lt;br /&gt;    * sudo make install&lt;br /&gt;&lt;br /&gt;Step 4--&lt;br /&gt;&lt;br /&gt;using kannel -----&lt;br /&gt;&lt;br /&gt;to start---&lt;br /&gt; sudo /etc/init.d/kannel start&lt;br /&gt;&lt;br /&gt;then fire these in diffrent terminal/tab&lt;br /&gt;sudo  gw/bearerbox gw/smskannel.conf&lt;br /&gt;&lt;br /&gt;sudo gw/smsbox gw/smskannel.conf&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reference Site--&lt;br /&gt;--&gt; installation of kannel&lt;br /&gt;http://www.ddj.co.za/archives/46/howto-compile-kannel-on-ubuntukubuntu-804&lt;br /&gt;&lt;br /&gt;--&gt; how to  configure the kannel&lt;br /&gt;http://www.chipmunkninja.com/Setting-up-Configuring-and-Using-13@&lt;br /&gt;&lt;br /&gt;--&gt; kannel configuration to send and receive using sms provider(Clickatell)&lt;br /&gt;&lt;br /&gt;smskannel.conf&lt;br /&gt;&lt;br /&gt;group = core&lt;br /&gt;admin-port = 13009&lt;br /&gt;smsbox-port = 13001&lt;br /&gt;admin-password = bar&lt;br /&gt;box-deny-ip = "*.*.*.*"&lt;br /&gt;box-allow-ip = "127.0.0.1"&lt;br /&gt;&lt;br /&gt;group = smsc&lt;br /&gt;smsc = http&lt;br /&gt;smsc-id = click&lt;br /&gt;system-id = click_tell_system_id(1234)&lt;br /&gt;system-type = clickatell&lt;br /&gt;smsc-username = clickatell_username&lt;br /&gt;smsc-password = clickatell_passwd&lt;br /&gt;send-url = "http://api.clickatell.com/http/sendmsg"&lt;br /&gt;port = 13015&lt;br /&gt;allowed-smsc-id = click&lt;br /&gt;connect-allow-ip = 127.0.0.1&lt;br /&gt;&lt;br /&gt;group = smsbox&lt;br /&gt;bearerbox-host = 127.0.0.1&lt;br /&gt;sendsms-port = 13013&lt;br /&gt;global-sender = 13013&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;group = sendsms-user&lt;br /&gt;username = uname(uname and password that you will be used for sending sms)&lt;br /&gt;password = xxxxx&lt;br /&gt;user-deny-ip = "*.*.*.*"&lt;br /&gt;user-allow-ip = "127.0.0.1"&lt;br /&gt;max-messages = 2&lt;br /&gt;default-smsc = click&lt;br /&gt;&lt;br /&gt;--&gt; kannel configuration with mobile device connected to pc&lt;br /&gt;I tried this with ubuntu and nokia 6080&lt;br /&gt;(Note: there were problem while receiving sms in higer version of nokia)&lt;br /&gt;&lt;br /&gt;before going to smskannel.conf&lt;br /&gt;&lt;br /&gt;connected the mobile to USB port&lt;br /&gt;&lt;br /&gt;check at which port it get connected by using&lt;br /&gt;tail /var/log/message/&lt;br /&gt;( May it connect at /dev/ttyxxx)&lt;br /&gt;The device port will be used in conf file&lt;br /&gt;&lt;br /&gt;smskannel.conf&lt;br /&gt;&lt;br /&gt;group = smsc&lt;br /&gt;smsc = at&lt;br /&gt;modemtype = AT2&lt;br /&gt;device = /dev/ttyUSB0&lt;br /&gt;#device = /dev/ttyACM0&lt;br /&gt;speed = 0&lt;br /&gt;smsc-id = Nokia_smsc&lt;br /&gt;port = 13131&lt;br /&gt;log-level = 0&lt;br /&gt;&lt;br /&gt;group = modems&lt;br /&gt;id = AT2&lt;br /&gt;name = "Nokia 6080 config"&lt;br /&gt;detect-string="Nokia"&lt;br /&gt;detect-string2="Nokia 6080"&lt;br /&gt;init-string = "AT+CNMI=1,2,0,1,0"&lt;br /&gt;speed = 19200&lt;br /&gt;&lt;br /&gt;group = sms-service&lt;br /&gt;keyword = default&lt;br /&gt;text = "Accessing default services"&lt;br /&gt;send-sender = true&lt;br /&gt;&lt;br /&gt;--&gt; Kannel with Teltonika modem&lt;br /&gt;&lt;br /&gt;group = smsc&lt;br /&gt;smsc = at&lt;br /&gt;smsc-id = "INNER"&lt;br /&gt;modemtype = teltonika&lt;br /&gt;device = /dev/ttyS0&lt;br /&gt;#device = /dev/ttyUSB0&lt;br /&gt;#device = /dev/ttyACM0&lt;br /&gt;speed = 0&lt;br /&gt;port = 13131&lt;br /&gt;log-level = 0&lt;br /&gt;sim-buffering = true&lt;br /&gt;&lt;br /&gt;# cofiguration for teltonika modem g10(COM)&lt;br /&gt;&lt;br /&gt;group = modems&lt;br /&gt;id = teltonika&lt;br /&gt;name = "Teltonika G10"&lt;br /&gt;detect-string = "Undefined"&lt;br /&gt;enable-mms = true&lt;br /&gt;init-string = "AT+CNMI=2,2,0,1,1"&lt;br /&gt;speed = 115200&lt;br /&gt;message-storage = "SM"&lt;br /&gt;&lt;br /&gt;Running kannel--------------------&lt;br /&gt;&lt;br /&gt;--&gt; to start---&lt;br /&gt;/etc/init.d/kannel start&lt;br /&gt;&lt;br /&gt;--&gt; then fire these in diffrent terminal/tab&lt;br /&gt;gw/bearerbox gw/smskannel.conf&lt;br /&gt;gw/smsbox gw/smskannel.conf&lt;br /&gt;&lt;br /&gt;---&gt; send sms  by both ways&lt;br /&gt;http://localhost:13013/cgi-bin/sendsms?username=username&amp;amp;password=passwd&amp;amp;to=to_no&amp;amp;text=helloworld&amp;amp;coding=2&amp;amp;charset=iso-8859-7&lt;br /&gt;(Note:- username and password that given in smskannel.conf)&lt;br /&gt;&lt;br /&gt;--&gt; Connect java prog with kannel&lt;br /&gt;/*&lt;br /&gt;* To change this template, choose Tools | Templates&lt;br /&gt;* and open the template in the editor.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package com.myapp.struts.window;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;* @author chetan&lt;br /&gt;*/&lt;br /&gt;public class sendSmsByKannel {&lt;br /&gt;&lt;br /&gt;   //public String send(String serverIP, String serverSendPort, String user, String password, String smsc, String mt, String text, String from) {&lt;br /&gt;     public String send(String serverIP, String serverSendPort, String user, String password,  String toNO, String text, String from) {&lt;br /&gt;       String result = "";&lt;br /&gt;       try {&lt;br /&gt;           String data = java.net.URLEncoder.encode(text, "UTF8");&lt;br /&gt;           String msisdn = java.net.URLEncoder.encode(toNO, "UTF8");&lt;br /&gt;           String sendURL = "http://" + serverIP + ":" + serverSendPort + "/cgi-bin/sendsms?username=" + user + "&amp;amp;password=" + password + "&amp;amp;charset=utf-8&amp;amp;coding=2&amp;amp;to=" + msisdn + "&amp;amp;text=" + data ;// "&amp;amp;smsc=" + smsc+ "&amp;amp;from=" + from;&lt;br /&gt;&lt;br /&gt;           java.net.URL url = new java.net.URL(sendURL);&lt;br /&gt;           java.io.InputStream in = url.openStream();&lt;br /&gt;           java.io.BufferedInputStream bufIn = new java.io.BufferedInputStream(in);&lt;br /&gt;           for (;;) {&lt;br /&gt;               int car = bufIn.read(); // Check for EOF&lt;br /&gt;               if (car == -1) {&lt;br /&gt;                   break;&lt;br /&gt;               } else {&lt;br /&gt;                   result = result + (char) car;&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           bufIn.close();&lt;br /&gt;           in.close();&lt;br /&gt;&lt;br /&gt;       } catch (Exception e) {&lt;br /&gt;           e.printStackTrace();&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;   public static void main(String args[]){&lt;br /&gt;       sendSmsByKannel ssk=new sendSmsByKannel();&lt;br /&gt;        ssk.send(localhost, 13013,  user,  password,   toNO,  text,  from) {&lt;br /&gt;     &lt;br /&gt;       System.out.println("Message sened succesfully");&lt;br /&gt;     &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;That's it !___________________&lt;br /&gt;¢нeтαη Menge&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8356607320505232977-8947172367240668884?l=chetanmenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chetanmenge.blogspot.com/feeds/8947172367240668884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8356607320505232977&amp;postID=8947172367240668884' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/8947172367240668884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8356607320505232977/posts/default/8947172367240668884'/><link rel='alternate' type='text/html' href='http://chetanmenge.blogspot.com/2009/05/sms-sending-through-web-application.html' title='SMS sending through WEB application'/><author><name>Chetan Menge</name><uri>http://www.blogger.com/profile/05483522733435404933</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry></feed>
