2017-04-21 4 views
0

Bei Eingabe von MyTextFieldMaxLength2:
a) '1' markieren und auf Nummer 9 klicken => wird ersetzt = '9'. .. ok
b) '12' markieren und auf Nummer 9 klicken => nichts passiertJavaFX: eigenes TextField mit maximal 2 Zeichen ... kann nicht alle markierten Zeichen ersetzen

Wie kann ich bekommen, dass selbst wenn alle zwei Nummern markiert sind, diese durch eine neue Nummer ersetzt wird?

public class MyTextFieldMaxLength2 extends TextField { 

    public boolean ifCondition_validate(String text) { 
     return (getText().length() < 2 || text.equals("")) && text.matches("[0-9]*"); 
    } 


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

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

Antwort

1

Sie dies, indem Sie einen TextFormatter auf einem Standard-Textfeld leicht tun können, statt Subklassifizieren Textfeld:

TextField textField = new TextField(); 

UnaryOperator<TextFormatter.Change> filter = c -> { 
    String proposedText = c.getControlNewText(); 
    if (proposedText.matches("[0-9]{0,2}")) { 
     return c ; 
    } else { 
     return null ; 
    } 
}; 
textField.setTextFormatter(new TextFormatter<String>(filter)); 
+0

Zunächst einmal vielen Dank für die Lösung. Ich arbeite an einer großen grafischen Anwendung mit dem SceneBuilder. Ich mag das Konzept eigener TextField-Klassen mit speziellen Eigenschaften zu bauen und dann einheitlich über SceneBuilder zu verwenden. Ich hatte gehofft, dass es eine Lösung für das Problem direkt in der MyTextFieldMaxLength2-Klasse gibt, so dass die Funktionalität innerhalb der abgeleiteten TextField-Klassen sauber gebündelt werden kann. Ich werde noch ein paar Tage warten, vielleicht hat jemand eine Idee. Im anderen Fall nehme ich Ihre Lösung. Danke noch einmal. – Sten

+0

@Sten warum verwenden Sie diese Lösung nicht einfach in einer Textfeldunterklasse? –

+0

Ich habe meine Idee mit der TextField-Unterklasse verworfen. Ich bleibe bei deinem direkten Ansatz und habe nur die Filtermethode als statisch neu aufgebaut. Also muss ich die Filtermethoden verwenden, z.B. "filter_onlyMax2Numbers", "filter_only0xOr1xComma" nur einmal und kann sie dann überall in der Anwendung verwenden. So funktioniert es sehr gut. Vielen Dank. – Sten

0

leid, aber innerhalb der Unterklasse der Begrenzer nicht funktioniert. Ich mache etwas falsch. Ich habe versucht, es umzusetzen.

public class MyTextFieldOnlyNumbersAndMaxLength2_v2 extends TextField {  
    private TextField textField = new TextField(); 

    public MyTextFieldOnlyNumbersAndMaxLength2_v2() { 
     super(); 
     textField.setTextFormatter(new TextFormatter<String>(filter)); 
    } 

    UnaryOperator<TextFormatter.Change> filter = c -> { 
     String proposedText = c.getControlNewText(); 
     if (proposedText.matches("[0-9]{0,2}")) { 
      return c ; 
     } else { 
      return null ; 
     } 
    }; 
} 

//for test: 
public class Main extends Application { 
    @Override 
    public void start(Stage stage) { 
     VBox vbox = new VBox(); 
     MyTextFieldOnlyNumbersAndMaxLength2_v2 myTextField = new MyTextFieldOnlyNumbersAndMaxLength2_v2(); 

     myTextField.setOnAction(e -> { 
      System.out.println("input: " + myTextField.getText()); 
     }); 

     vbox.getChildren().add(myTextField); 
     stage.setScene(new Scene(vbox, 500, 200)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
Verwandte Themen