2014-09-17 11 views
5

ho provato il controllo Spinner in Java 8u40inserire i numeri solo in Spinner controllo

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Spinner; 
import javafx.scene.control.SpinnerValueFactory; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class MainApp extends Application 
{ 
    public static void main(String[] args) 
    { 
     Application.launch(args); 
    } 

    @Override 
    public void start(Stage stage) 
    { 
     final Spinner spinner = new Spinner(); 

     spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000)); 
     spinner.setEditable(true); 

     GridPane grid = new GridPane(); 
     grid.setHgap(10); 
     grid.setVgap(10); 
     grid.setPadding(new Insets(10)); 

     int row = 0; 

     grid.add(new Label("Spinner:"), 0, row); 
     grid.add(spinner, 1, row); 

     Scene scene = new Scene(grid, 350, 300); 

     stage.setTitle("Hello Spinner"); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

Come posso inserire solo il numero nel campo casella di selezione?

Ora posso inserire numeri e testo. C'è qualche esempio che può essere usato come esempio?

+0

Hai trovato una soluzione migliore per il tuo problema? – babyinEclipse

risposta

4
  • perché Spinner utilizza TextField come redattore, gli utenti possono inserire qualsiasi stringa in filatore
  • solo dopo che l'utente preme il tasto di ritorno poi modello Spinners (SpinnerValueFactory implementazione) convalida l'input degli utenti

in modo da avere per aggiungere la convalida di editor di Spinners per codice:

// imports omitted 

public class MainApp extends Application { 

protected static final String INITAL_VALUE = "0"; 

public static void main(String[] args) { 
    Application.launch(args); 
} 

@Override 
public void start(Stage stage) { 
    final Spinner spinner = new Spinner(); 

    spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000, 
      Integer.parseInt(INITAL_VALUE))); 
    spinner.setEditable(true); 

    EventHandler<KeyEvent> enterKeyEventHandler; 

    enterKeyEventHandler = new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent event) { 

      // handle users "enter key event" 
      if (event.getCode() == KeyCode.ENTER) { 

       try { 
    // yes, using exception for control is a bad solution ;-) 
      Integer.parseInt(spinner.getEditor().textProperty().get()); 
       } 
       catch (NumberFormatException e) { 

        // show message to user: "only numbers allowed" 

        // reset editor to INITAL_VALUE 
        spinner.getEditor().textProperty().set(INITAL_VALUE); 
       } 
      } 
     } 
    }; 

    // note: use KeyEvent.KEY_PRESSED, because KeyEvent.KEY_TYPED is to late, spinners 
    // SpinnerValueFactory reached new value before key released an SpinnerValueFactory will 
    // throw an exception 
    spinner.getEditor().addEventHandler(KeyEvent.KEY_PRESSED, enterKeyEventHandler); 

    GridPane grid = new GridPane(); 
    grid.setHgap(10); 
    grid.setVgap(10); 
    grid.setPadding(new Insets(10)); 

    int row = 0; 

    grid.add(new Label("Spinner:"), 0, row); 
    grid.add(spinner, 1, row); 

    Scene scene = new Scene(grid, 350, 300); 

    stage.setTitle("Hello Spinner"); 
    stage.setScene(scene); 
    stage.show(); 
} 
} 
  • prova con non numeri: co de sostituirà filatori contenuti editore con VALORE INIZIALE
  • provare con i numeri di confine, filatori modello sarà ripristinare filatori editor per valore valido
5

Non del tutto certi circa l'esigenza - supponendo che si desidera impedire l'immissione di caratteri che non analizzerebbe un numero valido.

In tal caso, l'utilizzo di un TextFormatter nell'editor di Spinner viene in soccorso: con esso, si monitora qualsiasi modifica del testo e lo si accetta o lo si rifiuta. La decisione è incapsulata all'interno del filtro del formattatore. Una versione molto semplice (c'è sicuramente molto altro da fare, vedere DefaultFormatter di Swing)

// get a localized format for parsing 
NumberFormat format = NumberFormat.getIntegerInstance(); 
UnaryOperator<TextFormatter.Change> filter = c -> { 
    if (c.isContentChange()) { 
     ParsePosition parsePosition = new ParsePosition(0); 
     // NumberFormat evaluates the beginning of the text 
     format.parse(c.getControlNewText(), parsePosition); 
     if (parsePosition.getIndex() == 0 || 
       parsePosition.getIndex() < c.getControlNewText().length()) { 
      // reject parsing the complete text failed 
      return null; 
     } 
    } 
    return c; 
}; 
TextFormatter<Integer> priceFormatter = new TextFormatter<Integer>(
     new IntegerStringConverter(), 0, filter); 

spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(
     0, 10000, Integer.parseInt(INITAL_VALUE))); 
spinner.setEditable(true); 
spinner.getEditor().setTextFormatter(priceFormatter); 
+0

downvoter, cura di spiegare? – kleopatra

+0

Non è il downvoter originale, ma ecco la mia spiegazione: la tua soluzione letterale non ha funzionato. Quando ho provato ad usarlo, il contenuto visibile dello spinner non è cambiato in rotazione. Certo, ero di fretta e non sono andato in profondità (non ho mai controllato il DefaultFormatter di Swing come suggerito), ma il fatto che il codice abbia rotto il meccanismo di base di Spinner è stato un disastro - e alla fine ho fatto ricorso a TextFields con convalida su presentazione, errori mostrati in una finestra di dialogo, che è stata una soluzione estremamente triste, anche se in qualche modo pratica. –

+0

@GiulioPiancastelli grazie per il vostro feedback :-) E 'stato un po' ma relativamente certo che ha funzionato nel momento in cui ho scritto la risposta, almeno non posso immaginare che non avrei controllato il comportamento standard - la merda succede, però. Potrebbe provare uno di questi giorni e aggiornarlo se necessario. – kleopatra

Problemi correlati