JSpinner -> não estou me entendendo com ele

Pessoal, tô tomando uma surra do JSpinner.

Eu quero um JSpinner numérico que tenha limite de 1 a 5 e que só permita digitar valores numéricos dentro dele.

Pra criar o limite eu fiz assim e funcionou perfeitamente:

SpinnerModel model = new SpinnerNumberModel(1, 1, 5, 1); spnColunas.setModel(model);

Então agora, a encrenca era que ele deixava digitar qq coisa no seu editor, então consegui resolver isso, fazendo assim:

[code]JFormattedTextField ftf = new JFormattedTextField();
ftf.setDocument(new FiltroNumero(1)); // FiltroNumero faz um filtro em que aceita apenas números, no caso, de acordo com o parâmetro 1, ele permite apenas 1 dígito
ftf.setBorder(null);

spnColunas.setEditor(ftf);[/code]

Tentei usar a forma tradicional de filtro do JSpinner, fazendo como abaixo, só que não funcionou:

spnColunas.setEditor(new JSpinner.NumberEditor(spnColunas, "#"));

Enfim, tava tudo lindo, só que isoladamente! Eu não consigo fazer funcionar as duas coisas, entendem? Ou eu setto o Editor dele, ou eu setto o Model, qdo eu setto o Editor o Model deixa de funcionar. E ai? O que estou fazendo de errado?!

Eu segui exs desse link:
http://java.sun.com/docs/books/tutorial/uiswing/components/spinner.html

Se vc adicionar um ChangeListener e verificar se eh numero inteiro e entre 1 e 5, nao funciona ?

//Daniel

Creio que sim, através de listeners posso fazer qq verificação. Mas isso permitirá que meu usuário digite o que quiser e só depois farei a consistência. Pq não posso deixar ele com um filtro pré-definido?

Dei uma pesquisada por ai, e isso foi o que eu consegui fazer. Ve se isso resolve o seu problema.

Pensei tb, para facilitar pro usuario seria legal, quando esse JSpinner ganhar o foco vc marcar todo o texto, fica mais facil pra edicao. Uma vez que o usuario digita ja sobrescreve o valor antigo.

Como eu setei o setAllowsInvalid pra false, nao sera permitido ate mesmo branco, entao o backspace e del nao funcionarao.

ps: se vc achou outra solucao posta ai porque eu to curioso como fazer isso tb.


import javax.swing.*;
import javax.swing.text.DefaultFormatter;

public class TestSpinner extends JFrame {
	
	public TestSpinner() { 
	
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0,10,1));
		
		JSpinner.DefaultEditor editor = (JSpinner.NumberEditor)spinner.getEditor();		
				
		DefaultFormatter formatter = (DefaultFormatter)editor.getTextField().getFormatter();

		formatter.setAllowsInvalid(false);
		
		add(spinner);
		
		pack();
		setVisible(true);		
		
	}
	
	public static void main(String[] args) { 		
		new TestSpinner();		
	}	

}

Olá! Obrigada por responder!

Na verdade não achei uma solução melhor não… entendi sua idéia e ficou legal tb, mas no meu caso, acho que é melhor deixar da forma como está.

Ele está permitindo digitar o que quiser, e quando sai do campo ele faz as consistências. Interessante que tínhamos falado de consistir usando listeners, mas não precisa, ele já faz essas consistências sozinho.

T+, :wink: