All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.cmu.tetradapp.util.IntSpinner Maven / Gradle / Ivy

The newest version!
///////////////////////////////////////////////////////////////////////////////
// For information as to what this class does, see the Javadoc, below.       //
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,       //
// 2007, 2008, 2009, 2010, 2014, 2015, 2022 by Peter Spirtes, Richard        //
// Scheines, Joseph Ramsey, and Clark Glymour.                               //
//                                                                           //
// This program is free software; you can redistribute it and/or modify      //
// it under the terms of the GNU General Public License as published by      //
// the Free Software Foundation; either version 2 of the License, or         //
// (at your option) any later version.                                       //
//                                                                           //
// This program is distributed in the hope that it will be useful,           //
// but WITHOUT ANY WARRANTY; without even the implied warranty of            //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             //
// GNU General Public License for more details.                              //
//                                                                           //
// You should have received a copy of the GNU General Public License         //
// along with this program; if not, write to the Free Software               //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA //
///////////////////////////////////////////////////////////////////////////////

package edu.cmu.tetradapp.util;

import javax.swing.*;
import java.awt.*;
import java.util.Objects;

/**
 * A JSpinner that uses a IntTextField as its editor.  When changes are made from the editor or the spinner
 * a property change event is invoked with the property name "changedIntValue" and the new value (old value is not
 * given).
 *
 * @author Tyler Gibson
 * @version $Id: $Id
 */
public class IntSpinner extends JSpinner {


    /**
     * The editor
     */
    private final IntTextField editor;

    /**
     * Filter to use.
     */
    private Filter filter;


    /**
     * Min value
     */
    private Integer min;

    /**
     * Max value
     */
    private Integer max;

    /**
     * Constructs the int spinner given the initial value, the min value to accept, the max value to accept and the
     * step.
     *
     * @param value - Initial value to dispaly
     * @param step  - The step (the amount that is "jumped" when the spinner is activated)
     * @param size  - The size of the int text field.
     */
    public IntSpinner(Integer value, Integer step, Integer size) {
        super(new SpinnerNumberModel(value, null, null, step));
        this.editor = new IntTextField(value, size);
        // make the spinner a bit bigger than the text field (looks better)
        this.setPreferredSize(IntSpinner.increment(this.editor.getPreferredSize()));
        this.setMaximumSize(IntSpinner.increment(this.editor.getMaximumSize()));
        this.setMinimumSize(IntSpinner.increment(this.editor.getMinimumSize()));
        this.setSize(IntSpinner.increment(this.editor.getSize()));

        this.editor.setFilter((value1, oldValue) -> {
            if (IntSpinner.this.min != null && value1 < IntSpinner.this.min) {
                value1 = IntSpinner.this.min;
            } else if (IntSpinner.this.max != null && IntSpinner.this.max < value1) {
                value1 = IntSpinner.this.max;
            }
            return value1;
        });

        // Can't do this in the filter, due to other events calling the filter
        this.editor.addActionListener(e -> {
            IntTextField field = (IntTextField) e.getSource();
            String text = field.getText();
            try {
                // parse value and let the field filter it.
                int value12 = Integer.parseInt(text);
                field.setValue(value12);
                value12 = field.getValue();
                if (!IntSpinner.this.getValue().equals(value12)) {
                    IntSpinner.this.setValue(value12);
                }
            } catch (Exception ex) {
                // do nothing in this case
            }
        });

        this.setEditor(this.editor);
    }

    private static Dimension increment(Dimension dim) {
        return new Dimension(dim.width + 2, dim.height + 2);
    }

    /**
     * 

Setter for the field min.

* * @param min a {@link java.lang.Integer} object */ public void setMin(Integer min) { if (!Objects.equals(this.min, min)) { this.min = min; SpinnerNumberModel model = (SpinnerNumberModel) this.getModel(); model.setMinimum(min); // update the text filed by resetting value this.editor.setValue(this.editor.getValue()); } } /** * Sets the max value for the spinner. * * @param max a {@link java.lang.Integer} object */ public void setMax(Integer max) { if (!Objects.equals(this.max, max)) { this.max = max; SpinnerNumberModel model = (SpinnerNumberModel) this.getModel(); model.setMaximum(max); // update the text filed by resetting value this.editor.setValue(this.editor.getValue()); } } /** *

Setter for the field filter.

* * @param filter a {@link edu.cmu.tetradapp.util.IntSpinner.Filter} object */ public void setFilter(Filter filter) { this.filter = filter; } /** * {@inheritDoc} */ public void setValue(Object object) { if (object == null) { throw new NullPointerException(); } int value = filter((Integer) object); if (!getValue().equals(value)) { super.setValue(value); this.editor.setUnfilteredValue(value); } } private int filter(int value) { if (this.filter == null) { return value; } if (getValue().equals(value)) { return value; } return this.filter.filter((Integer) getValue(), value); } /** * Interface for filtering values. */ public interface Filter { /** *

filter.

* * @param oldValue a int * @param newValue a int * @return a int */ int filter(int oldValue, int newValue); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy