2012-12-05 20 views

risposta

7

Il mio esempio di mask.

Usando:

<MaskField mask="+7(DDD)DDD-DDDD"/> 
<MaskField mask="AA DDD AAA" placeholder="__ ### ___"/> 

ecc

+1

funziona anche quando si incolla dagli appunti, grande – user11153

1

supportate da JavaFX-2 attuale piattaforma di default - No, ma passare attraverso this link, ha molte intuizioni e codice di esempio per la convalida forma in JavaFX

2

Limitazione input da Richard's fxexperience post:

TextField field = new TextField() { 
    @Override public void replaceText(int start, int end, String text) { 
     // If the replaced text would end up being invalid, then simply 
     // ignore this call! 
     if (!text.matches("[a-z]")) { 
      super.replaceText(start, end, text); 
     } 
    } 

    @Override public void replaceSelection(String text) { 
     if (!text.matches("[a-z]")) { 
      super.replaceSelection(text); 
     } 
    } 
}; 

Se vuoi creare il tuo uso di una maschera e creare il tuo controllo, dai uno sguardo allo Richard's MoneyField, che include anche un esempio di progetto e fonte. Lungo le stesse linee ci sono i controlli per restringere l'input a Integers, Doubles o ai colori Web formattati (ad es. #rrggbb) nello fxexperience repository. Tutti seguono un tema comune in cui sottoclasse Control, forniscono alcune proprietà da ottenere e impostare che definiscono l'interfaccia pubblica e quindi definiscono anche uno skin di protezione privato che gestisce il rendering dell'interfaccia utente in base ai valori impostati tramite l'interfaccia pubblica.

2

NOTA: questo funziona correttamente solo con JRE 1.8.0_25 o inferiore. Con JRE 1.8.0_48 o 0_51, la posizione del cursore è sempre impostata su 0 dopo ogni immissione di carattere.

No, questo non è implementato in JavaFX standard. Devi usare qualche biblioteca o farlo da solo.

Questa è la mia implementazione della maschera statica per i campi di testo. Si lavora per la data, telefono e altri tipi di maschere statici:

/** 
* Adds a static mask to the specified text field. 
* @param tf the text field. 
* @param mask the mask to apply. 
* Example of usage: addMask(txtDate, "// "); 
*/ 
public static void addMask(final TextField tf, final String mask) { 
    tf.setText(mask); 
    addTextLimiter(tf, mask.length()); 

    tf.textProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) { 
      String value = stripMask(tf.getText(), mask); 
      tf.setText(merge(value, mask)); 
     } 
    }); 

    tf.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(final KeyEvent e) { 
      int caretPosition = tf.getCaretPosition(); 
      if (caretPosition < mask.length()-1 && mask.charAt(caretPosition) != ' ' && e.getCode() != KeyCode.BACK_SPACE && e.getCode() != KeyCode.LEFT) { 
       tf.positionCaret(caretPosition + 1); 
      } 
     } 
    }); 
} 

static String merge(final String value, final String mask) { 
    final StringBuilder sb = new StringBuilder(mask); 
    int k = 0; 
    for (int i = 0; i < mask.length(); i++) { 
     if (mask.charAt(i) == ' ' && k < value.length()) { 
      sb.setCharAt(i, value.charAt(k)); 
      k++; 
     } 
    } 
    return sb.toString(); 
} 

static String stripMask(String text, final String mask) { 
    final Set<String> maskChars = new HashSet<>(); 
    for (int i = 0; i < mask.length(); i++) { 
     char c = mask.charAt(i); 
     if (c != ' ') { 
      maskChars.add(String.valueOf(c)); 
     } 
    } 
    for (String c : maskChars) { 
     text = text.replace(c, ""); 
    } 
    return text; 
} 

public static void addTextLimiter(final TextField tf, final int maxLength) { 
    tf.textProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) { 
      if (tf.getText().length() > maxLength) { 
       String s = tf.getText().substring(0, maxLength); 
       tf.setText(s); 
      } 
     } 
    }); 
} 

Vedi anche: JavaFX 2.2 TextField maxlength

0
public class NumberTextField extends TextField { 
    private int maxLenght; 

    public NumberTextField(int maxLenght) { 
     super(); 
     this.maxLenght = maxLenght; 
    } 

    @Override 
    public void replaceText(int start, int end, String text) { 
     if (validate(text)) { 
      super.replaceText(start, end, text); 
     } 
    } 

    @Override 
    public void replaceSelection(String text) { 
     if (validate(text)) { 
      super.replaceSelection(text); 
     } 
    } 

    private boolean validate(String text) { 
     if (this.getText() != null) { 
     } 
     boolean status = ("".equals(text) || text.matches("[0-9]")); 
     if (this.getText() == null) { 
      return status; 
     } else { 
      return (status && this.getText().length() < maxLenght); 
     } 
    } 
} 
2

ho avuto gli stessi bisogni. Ho creato questo campo, chiamato SpecialTextField e inserito in GitHub. Esempio anche lì. Spero che questo aiuto.

0

In alcuni casi ho sarebbe convalidare la proprietà text:

myTextField 
    .textProperty() 
    .addListener(
    (obs, oldVal, newVal) -> 
     { 
      if(!newVal.matches("\\d+")) 
       textField.setText(oldV); 
     }); 

Sfortunato: textField.setText(oldV); entrerà di nuovo la stessa funzione, test inutilmente se OLDVAL corrisponde .

Se il campo di testo diventa un valore che non corrisponde prima che questo listener venga aggiunto al campo di testo, immettere un nuovo valore non corrispondente causerà un ciclo !!!

Per evitare questo, sarà più sicuro di scrivere:

String acceptableValue = "0"; 
myTextField 
    .textProperty() 
    .addListener(
    (obs, oldVal, newVal) -> 
     { 
      if(!newVal.matches("\\d+")) 
       textField.setText(oldVal.matches("\\d+") ? oldV : acceptableValue); 
     }); 
0

ho scritto una classe che estende TextField e applicare la maschera.

package com.model; 

import java.text.NumberFormat; 
import java.util.Locale; 

/** 
* ATENTION 
* DO NOT FORGUET TO IMPORT IN FXML 
* <?import com.view.TextFieldMoney?> 
* 
* */ 

import javafx.scene.control.TextField; 

public class TextFieldMoney extends TextField { 
    private int maxlength; 
    private String valor = ""; 

    public TextFieldMoney() { 
     this.maxlength = 11; 
    } 

    public void setMaxlength(int maxlength) { 
     this.maxlength = maxlength; 
    } 

    @Override 
    public void replaceText(int start, int end, String text) { 
     // Delete or backspace user input. 
     if (getText() == null || getText().equalsIgnoreCase("")) { 
      valor = ""; 
     } 
     if (text.equals("")) { 
      super.replaceText(start, end, text); 
     } else{ 


      text = text.replaceAll("[^0-9]", ""); 
      valor += text; 

      super.replaceText(start, end, text); 
      if (!valor.equalsIgnoreCase("")) 
       setText(formata(valor)); 
     } 
    } 

    @Override 
    public void replaceSelection(String text) { 
     // Delete or backspace user input. 
     if (text.equals("")) { 
      super.replaceSelection(text); 
     } else if (getText().length() < maxlength) { 
      // Add characters, but don't exceed maxlength. 
      // text = MascaraFinanceira.show(text); 
      if (text.length() > maxlength - getText().length()) { 
       // text = MascaraFinanceira.show(text); 
       text = text.substring(0, maxlength - getText().length()); 
      } 
      super.replaceSelection(text); 
     } 
    } 

    /* 
    *Return the number without money mask 
    **/ 

    public String getCleanValue(){ 
     String cleanString = getText().replaceAll("[^0-9]", ""); 
     Double cleanNumber = new Double(cleanString); 
     return String.valueOf(cleanNumber/100); 
    } 

    private String formata(Double valor) { 
     Locale locale = new Locale("pt", "BR"); 
     NumberFormat nf = NumberFormat.getInstance(locale); 
     nf.setMaximumFractionDigits(2); 
     nf.setMinimumFractionDigits(2); 

     return nf.format(valor); 
    } 

    public String formata(String valor) { 
     double v = new Double(valor); 
     return formata(v/100); 
    } 

} 

E nel FXML dove è

<TextField fx:id="valorTextField" GridPane.columnIndex="2" GridPane.rowIndex="2" /> 

messo

<TextFieldMoney fx:id="valorTextField" GridPane.columnIndex="2" GridPane.rowIndex="2" /> 
Problemi correlati