2017-09-25 1 views
0

Nun, ich studiere Java FX, aber dieses Mal benutze ich FXML in NetBeans, dann möchte ich die von einem TextField erlaubten Keys einschränken. Wie nur Zahlen oder nur Buchstaben.Filter Tastatur TextField Java FXML

Ich habe This gefunden, dann habe ich eine neue Klasse erstellt, dann setzen Sie diesen Code (der als richtig in der Verknüpfung überprüft), ich TextField erweitern, aber wenn ich den Code ausführen, löst eine Ausnahme, ich denke, weil SceneBuilder doesn ist Hab meine Klasse nicht.

-Update habe ich einen ähnlichen Code für Java FX:

import java.util.function.UnaryOperator; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.scene.control.TextFormatter.Change; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author Alejandro 
*/ 
public class JavaFXApplication2 extends Application { 

@Override 
public void start(Stage primaryStage) { 

    TextField textField = new TextField(); 
    TextFormatter<String> textFormatter = getTextFormatter(); 
    textField.setTextFormatter(textFormatter); 

    VBox root = new VBox(); 

    root.getChildren().add(textField); 

    Scene scene = new Scene(root, 300, 250); 

    primaryStage.setTitle("TextFormat"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private TextFormatter<String> getTextFormatter() { 
    UnaryOperator<Change> filter = getFilter(); 
    TextFormatter<String> textFormatter = new TextFormatter<>(filter); 
    return textFormatter; 
} 

private UnaryOperator<Change> getFilter() { 
    return change -> { 
     String text = change.getText(); 

     if (!change.isContentChange()) { 
      return change; 
     } 

     if (text.matches("[a-z]*") || text.isEmpty()) { 
      return change; 
     } 

     return null; 
    }; 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    launch(args); 
} 

} 

Das obige Code funktioniert gut in einem Java FX app, aber ich brauche eine in Java FXML zu verwenden, ein Kerl unter verfassen ähnlicher Code, Es kompiliert, keine trows Ausnahme, aber funktioniert nicht, oder ich weiß nicht, wie man es implementiert.

+1

Diese Verbindung ist ziemlich alt. Sie sollten einen 'TextFormatter' für diese Art von Funktionalität verwenden. Siehe z. https://stackoverflow.com/questions/40472668/numeric-textfield-for-in-ntegers-in-javafx-8-with-textformatter-and-or-unaryoperat –

Antwort

0

Wenn Sie Ihren Text nur ALPHA/NUMERISCHE begrenzen Sie eine TextFormatter wie diese verwenden:

public class MaxLengthTextFormatter extends TextFormatter<String> { 
    private int maxLength; 

public MaxLengthTextFormatter(int maxLength) { 
    super(new UnaryOperator<TextFormatter.Change>() { 
     @Override 
     public TextFormatter.Change apply(TextFormatter.Change change) { 
      //If the user is deleting the text (i.e. full selection, ignore max to allow the 
      //change to happen) 
      if(change.isDeleted()) { 
       //if the user is pasting in, then the change could be longer 
       //ensure it stops at max length of the field 
       if(change.getControlNewText().length() > maxLength){ 
        change.setText(change.getText().substring(0, maxLength)); 
       } 

      }else if (change.getControlText().length() + change.getText().length() >= maxLength) { 
       int maxPos = maxLength - change.getControlText().length(); 
       change.setText(change.getText().substring(0, maxPos)); 
      } 
      return change; 
     } 
    }); 
    this.maxLength = maxLength; 
} 

public int getMaxLength() 
{ 
    return maxLength; 
} 

}

public class AlphaNumericTextFormatter extends TextFormatter<String> { 

    /** The Constant ALPHA_NUMERIC_ONLY. */ 
    //private static final String ALPHA_NUMERIC_ONLY = "^[a-zA-Z0-9]*$"; 
    /** MAKE NUMERIC ONLY **/ 
    private static final String DIGITS_ONLY = "^[0-9]*$"; 

    /** 
    * Instantiates a new alpha numeric text formatter. 
    */ 
    public AlphaNumericTextFormatter() { 
     super(applyFilter(null)); 
    } 

    /** 
    * Instantiates a new alpha numeric text formatter. 
    * 
    * @param maxLength 
    *   the max length 
    */ 
    public AlphaNumericTextFormatter(int maxLength) { 
     super(applyFilter(new MaxLengthTextFormatter(maxLength).getFilter())); 
    } 

    /** 
    * Apply filter. 
    * 
    * @param filter 
    *   the filter 
    * @return the unary operator 
    */ 
    private static UnaryOperator<Change> applyFilter(UnaryOperator<Change> filter) { 
     return change -> { 
      if (change.getControlNewText() != null && change.getControlNewText().matches(DIGITS_ONLY)) { 
       if (filter != null) { 
        filter.apply(change); 
       } 
       return change; 
      } 
      return null; 
     }; 
    } 

} 

, dass ein Formatierer erzeugt als nur Zahlen und Buchstaben erlaubt - Sie können das Muster an Ihre Bedürfnisse anpassen.

Sie fügen Sie es Ihrem Textfeld wie folgt ....

@FXML 
private TextField myTextField; 


@FXML 
private void initialize() { 
    //Create a alpha field which max length of 4 
    myTextField.setTextFormatter(new AlphaNumericTextFormatter(4)); 
} 
+0

Danke für die Antwort, der Code funktioniert, aber ich habe nicht genug erklärt Ich möchte das KeyEvent abfangen und nicht im TextField angezeigt werden. – Palomino9r

+0

Nicht sicher, ich verstehe, was Sie fragen. Sie möchten alle Schlüsseleingaben einschränken? Wenn ja, setze das Textfeld auf nicht editierbar. Ist das, was du fragst? –

+0

Nicht alle Tasteneingaben, sondern nur einige Tasten im TextField beschränken, um es nur numerisch oder nur A-Z zu machen. Für einen Validierungsprozess, wie wenn Sie Ihren Namen in eine Anmeldung eingeben, lässt das System nur Buchstaben eingeben, nicht Numerisch und keine Sonderzeichen. – Palomino9r