Oi pessoal.
Estou desenvolvendo uma janela onde preciso que se o valor escrito em um JTextField for de 1 a 5, ele habilite uma CheckBox, caso contrário a checkbox fica desabilitada. Tentei usar um focus listener, que funcionou parcialmente, já que o status da checkbox só é atualizado quando o campo de texto ganha ou perde o foco. Eu preciso que assim que o usuário modificar o valor, ele atualize o status da checkbox, habilitando ou desabilitando-a. Tentei um InputMethodListener mas ele nunca disparou um evento. O que estou fazendo de errado!? :shock:
Abraço!
public class NewSeqWindow extends JFrame implements WindowListener, ItemListener, InputMethodListener {
private JCheckBox chkEnableSchedule;
private JTextField seqNumber;
private JPanel pnlSchedule;
[...]
seqNumber.addInputMethodListener(this);
[...]
@Override
public void inputMethodTextChanged(InputMethodEvent event) {
System.out.println("DEBUG: listener");
if (event.getSource() == seqNumber) {
System.out.println("DEBUG: SEQNUMBER");
int value = Integer.parseInt(seqNumber.getText());
System.out.println(value);
if ( (value>0) && (value<=5) ) {
chkEnableSchedule.setEnabled(true);
}
else {
chkEnableSchedule.setEnabled(false);
}
}
}
}
Usa JSpinner, ai tu coloca so pra Integer e coloca minimo e maximo, pronto de 1 a 5
Hmmm… pois é, mas o problema é que o campo (TextField) deve permitir qualquer valor (de 0 a 9999), mas somente para valores entre 1 e 5 que um outro componente (CheckBox) é habilitado.
Em outras palavras: O usuário está criando uma nova seqüência animada (para painéis eletrônicos) e deve dar um número para ela. Se o número da seqüência for entre 1 e 5 é permitido o agendamento dela, se for qualquer outro número (maior que 6) o agendamento não é permitido, e suas opções desabilitadas.
Por isso preciso do listener para verificar o valor, entendeu?
De qualquer maneira, valeu pela dica!
Ok… resolvido. Como não consegui um listener que funcionasse com a mudança de valor do campo, coloquei um focusGained, focusLost e CaretPosition. Ou seja, ele dispara um evento sempre que ganhar ou perder foco ou mudar a posição do cursor no TextField. Acaba funcionando do jeito que eu precisava!
Opa, tenta meuTextField.addPropertyChangeListener(“text”, this);
E implementa no seu frame ou panel um propertychangelistener
O ideal eh
class MinhaCaixaTexto extends JTextField implements PropertyChangeListener {
}
Isso da certo
Ou tente usar um KeyListener, para fazer a verificação tecla a tecla. Algo como:
seqNumber.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
String texto = seqNumber.getText();
try {
int valor = Integer.parseInt(texto);
if (valor < 1 || valor > 5) {
throw new IllegalArgumentException();
}
chkEnableSchedule.setEnabled(true);
} catch (RuntimeException e) {
chkEnableSchedule.setEnabled(false);
}
}
}):