2012-12-05 17 views

Odpowiedz

7

Mój przykład z mask.

Zastosowanie:

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

itp

+1

Działa nawet podczas wklejania ze schowka, wielki – user11153

1

Obsługiwane przez obecnego javafx-2 platformy domyślnie - Nie, ale przejść przez this link, posiada wiele spostrzeżeń i przykładowy kod do sprawdzania poprawności formie, w JavaFX

2

Ograniczanie wejście od 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); 
     } 
    } 
}; 

Jeśli chcesz utworzyć maskę i stworzyć własną kontrolę, spójrz na Richard's MoneyField, która zawiera również przykładowy projekt i źródło. Wzdłuż tych samych linii znajdują się elementy sterujące do wprowadzania danych wejściowych do liczb całkowitych, podwójnych lub sformatowanych kolorów internetowych (np. #rrggbb) w fxexperience repository. Wszystkie one podążają za wspólnym motywem, w którym podklasę Control, zapewniają pewne właściwości, które należy uzyskać i ustawić, które definiują interfejs publiczny, a następnie definiują prywatną skórę podkładu, która obsługuje renderowanie interfejsu użytkownika w oparciu o wartości ustawione przez interfejs publiczny.

2

UWAGA: działa to poprawnie tylko w środowisku JRE 1.8.0_25 lub niższym. W przypadku JRE 1.8.0_48 lub 0_51 pozycja karetki jest zawsze ustawiona na 0 po każdym wprowadzeniu znaku.

Nie, nie jest to realizowane w standardowym JavaFX. Musisz skorzystać z biblioteki lub zrób to sam.

To jest moja implementacja maski statycznej dla pól tekstowych. Działa on na bieżąco, telefon i inne rodzaje masek statycznych:

/** 
* 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); 
      } 
     } 
    }); 
} 

Patrz także: 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

miałem te same potrzeby. Stworzyłem to pole, nazwano je SpecialTextField i wepchnąłem do GitHub. Przykład również tam. Mam nadzieję, że to pomoże.

0

W niektórych przypadkach chciałbym potwierdzić właściwość text:

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

Pechowy: textField.setText(oldV); będzie ponownie wprowadzić tę samą funkcję, testowanie niepotrzebnie jeśli oldval mecze .

Jeśli pole TextField staje się wartością, która nie pasuje, zanim ten słuchacz zostanie dodany do pola TextField, wpisanie niezgodnej nowej wartości spowoduje utworzenie pętli !!!

Aby tego uniknąć, to będzie bezpieczniej napisać:

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

napisałem klasę, która rozszerza TextField i zastosować maskę.

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); 
    } 

} 

A w FXML gdzie jest

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

umieścić

<TextFieldMoney fx:id="valorTextField" GridPane.columnIndex="2" GridPane.rowIndex="2" /> 
Powiązane problemy