JSpinner

10 respostas
C

Boa tarde pessoal,
estou com duvidas no uso do jspinner

tenho 2 jspinners com valores de 0 a 10
e quando eu alterar um jspinner eu queria incrementar ou decrementar o outro
alguem pode me ajudar?
[]s

10 Respostas

T

Você deve adicionar um ChangeListener a um dos JSpinners , para que acerte o valor do outro JSpinner.

addChangeListener

C

Ok isso eu consigo fazer, mas eu preciso saber quando está incrementando ou decrementando

tentei utilizar SpinnerListModel mas sem nenhum sucesso ainda

por exemplo a soma dos dois devem ser sempre 10.
entao se no spinner 1 tem 10
na hora q eu incrementar o spinner 2 ele vai ser 1 e o spinner 1 = 9
deu pra endenter ±?

apenas com o ChangeListener eu nao estou conseguindo saber

vlw

T

Uai, nunca vi ninguém usar SpinnerListModel. Todo mundo que eu vi só usa SpinnerNumberModel:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/SpinnerNumberModel.html

C

rsrs pois é foi uma tentativa… consegui usar o SpinnerNumberModel, mas só não consegui alterar o outro JSlider

algo do tipo

a ideia ± era o seguinte

um codigo exemplo

private JSpinner jspA;
	private JSpinner jspB;
	private JSpinner jspC;
	private SpinnerModel linkedModel;
	
	
	public SegmentSpinnerControl(Object[] values,JSpinner jspA, JSpinner jspB, JSpinner jspC) {
        super(values);
        firstValue = values[0];
        lastValue = values[values.length - 1];
        this.jspA = jspA;
		this.jspB = jspB;
		this.jspC = jspC;

    }
	 public void setLinkedModel(SpinnerModel linkedModel) {
	        this.linkedModel = linkedModel;
	        
	    }

//nessa funcao eu sei q o spinner está indo para o proximo valor
//mas aqui eu nao consigo setar outro jspinner
	public Object getNextValue(){
		 Object value = super.getNextValue();
	        if (value == null) {
	            value = firstValue;
	            if (linkedModel != null) {
	                linkedModel.setValue(linkedModel.getNextValue());

	            }
	        }
	        return value;
		
		
	}
	
    public Object getPreviousValue() {
        Object value = super.getPreviousValue();
        if (value == null) {
            value = lastValue;
            if (linkedModel != null) {
                linkedModel.setValue(linkedModel.getPreviousValue());
//aqui que eu nao sei manipular
//por exemplo gostaria de incrementar outro jslider ou adicionar outro valor
jspC.setValue(new Integer(10)); //isso já dá erro

            }
        }
        return value;
    }

deu pra entender ±?
vlw

T

Bom, vou fazer um exemplo bobo. Você disse que a soma dos dois JSpinners tem de ser 10, é isso? Acho que no seu ChangeListener você tem de fazer algo como: (supondo que o valor máximo de cada JSpinner seja 10):

...
    jspinner2.setValue (10.0 - ((Number)jspinner1.getValue()).doubleValue());
...
C

somar e setar valor ok, mas eu preciso saber se eu estou incrementando no jspinner (clicando na setinha pra cima ou pra baixo)

T

Não sei se você está incrementando ou decrementando. Não dá para pensar só em valores? Eu pedi para usar addChangeListener, não um getNextValue ou getPreviousValue (que normalmente não devem ser reescritos).

C

vou ter q sair do estagio agora e voltar pra aula mas vlw a ajuda.
dps vou tentar quebrar a cabeça pra resolver
[]s
mas qlqr ajuda é bem vinda

T
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SwingUtilities;

/**
 */
public class TesteJSpinner extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JSlider jslider1 = null;
    private JSlider jslider2 = null;
    private JSpinner jspinner1 = null;
    private JSpinner jspinner2 = null;

    /**
     * This method initializes jContentPane	
     * 	
     * @return javax.swing.JPanel	
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getJslider1(), null);
            jContentPane.add(getJslider2(), null);
            jContentPane.add(getJspinner1(), null);
            jContentPane.add(getJspinner2(), null);
        }
        return jContentPane;
    }

    /**
     * This method initializes jslider1	
     * 	
     * @return javax.swing.JSlider	
     */
    private JSlider getJslider1() {
        if (jslider1 == null) {
            jslider1 = new JSlider(0, 10);
            jslider1.setMinorTickSpacing(1);
            jslider1.setMajorTickSpacing(5);
            jslider1.setPaintTicks(true);
            jslider1.setPaintLabels(true);
            jslider1.setSnapToTicks(true);
            jslider1.setBounds(new Rectangle(10, 10, 191, 51));
            jslider1.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent e) {
                    jspinner1.setValue(jslider1.getValue());
                    jslider2.setValue((int) Math.round (10.0 - ((Number)jslider1.getValue()).doubleValue()));
                }
            });
        }
        return jslider1;
    }

    /**
     * This method initializes jslider2	
     * 	
     * @return javax.swing.JSlider	
     */
    private JSlider getJslider2() {
        if (jslider2 == null) {
            jslider2 = new JSlider(0, 10);
            jslider2.setMinorTickSpacing(1);
            jslider2.setMajorTickSpacing(5);
            jslider2.setPaintTicks(true);
            jslider2.setPaintLabels(true);
            jslider2.setSnapToTicks(true);
            jslider2.setBounds(new Rectangle(10, 80, 191, 51));
            jslider2.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent e) {
                    jspinner2.setValue (jslider2.getValue());
                }
            });
        }
        return jslider2;
    }

    /**
     * This method initializes jspinner1	
     * 	
     * @return javax.swing.JTextField	
     */
    private JSpinner getJspinner1() {
        if (jspinner1 == null) {
            jspinner1 = new JSpinner();
            jspinner1.setBounds(new Rectangle(210, 30, 71, 31));
        }
        return jspinner1;
    }

    /**
     * This method initializes jspinner2	
     * 	
     * @return javax.swing.JSpinner	
     */
    private JSpinner getJspinner2() {
        if (jspinner2 == null) {
            jspinner2 = new JSpinner();
            jspinner2.setBounds(new Rectangle(210, 100, 71, 31));
        }
        return jspinner2;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TesteJSpinner thisClass = new TesteJSpinner();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    /**
     * This is the default constructor
     */
    public TesteJSpinner() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(getJContentPane());
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
    }

}
C

Thingol Obrigado pelo exemplo!
:smiley:

mas o interessante seria alterar apenas no jspinner, esse que está sendo o problema ;
Quando decrementar no jspinner1, ele incrementar no jspinner2.

Pois este seria um exemplo, na verdade tenho 3 jspinners(A,B,C).
a soma total não pode exceder 13

Quando o jspinner A decrescer o restante (diferença de 13) poderá ser usada somente em B.
Quando decrementar B o restante poderá ser usado em C ou em A.

por isso eu estava procurando saber como eu consigo saber, se o jspinner está decrementando ou incrementando.

Abraços

Criado 21 de novembro de 2007
Ultima resposta 26 de nov. de 2007
Respostas 10
Participantes 2