2017-10-01 1 views
-1

Ich habe schwer Zeit finden alle Anleitungen, wie zu addEventHandler für textfield, so dass es Echtzeit Validierung von Tasteneingaben zu nur hh:mm Zeitformat ermöglicht. Ich habe diesen Ausdruck ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$ gefunden, weiß aber nicht, wie ich ihn zur eventHandler hinzufügen soll. Auch ich habe versucht, simpleDateFormat aber ohne Erfolg zu verwenden.javafx: How to addEventHandler für javafx Textfeld für die Validierung Zeit

Edit: Ich versuche, so etwas zu machen (dies war mit JFrame):

JTextField iegadesVerTesksts = new JTextField(); 
panel.add(iegadesVerTesksts); 
iegadesVerTesksts.addKeyListener(new KeyAdapter() { 
     public void keyTyped(KeyEvent evt) { 
      char c = evt.getKeyChar(); 
      if ((!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || c == KeyEvent.VK_DELETE)) 
        &&evt.getKeyChar()!='.') { 
       evt.consume(); 
      } 
      if(evt.getKeyChar()=='.'&&iegadesVerTesksts.getText().contains(".")){ 
       evt.consume(); 
      } 
     } 
    }); 

Gerade jetzt mit JavaFX Ich habe Haupt- und piezimes.java erstellt. In der Produktklasse definiere ich Objekte, die ich erstellen möchten:

public class Piezimes { 
private LocalDate datums; 
private String laiks; 
private String piezime; 

public Piezimes(){ 
    this.datums = null; 
    this.laiks = ""; 
    this.piezime = ""; 
} 

public Piezimes (LocalDate datums, String laiks, String piezime){ 
    this.datums = datums; 
    this.laiks = laiks; 
    this.piezime = piezime; 
} 

public LocalDate getDatums() { 

    return datums; 
} 

public void setDatums(LocalDate datums) { 

    this.datums = datums; 
} 

public String getLaiks() { 

    return laiks; 
} 

public void setLaiks(String laiks) { 
    this.laiks = laiks; 
} 

public String getPiezime() { 

    return piezime; 
} 

public void setPiezime(String piezime) { 

    this.piezime = piezime; 
} 

}

Und in main.java ich Tableview erstellt haben, am Ende, wo ich Tasten hinzugefügt, wo ich rufe .getText so kann ich Benutzereingaben. Nur mit der Zeit Validierung habe ich Probleme mit. Methode im Augenblick, die ich anrufe, um Benutzereingabe zu Tabelle hinzuzufügen, ist: piezimes.setLaiks(laiksIevade.getText());

+0

https: // Stackoverflow. com/questions/31039449/java-8-u40-textformatter-javafx-zu-beschränken-user-input-only-für-dezimal-nummer https://stackoverflow.com/a/12851162/2189127 –

+0

@James_D versuchte beide. Funktioniert nicht für mein Programm ... –

+0

Sie sollten Ihre Frage neu schreiben, um zu zeigen, was Sie versucht haben und auf welche Weise es nicht funktioniert. Stellen Sie einen [MCVE] bereit. Die verknüpften Fragen bieten den richtigen Weg dazu. –

Antwort

-1

Um ehrlich zu sein, ich bin nicht sehr vertraut mit TextFormatter. Jedes Mal, wenn ich so etwas machen möchte, mache ich ein benutzerdefiniertes TextField, in dem ich einen changeListener zur textProperty hinzufüge und überprüfe, ob die Eingabe des Benutzers mit einer Regex übereinstimmt. Nun müssen Sie in Ihrer Situation mindestens eine weitere zur focusedProperty hinzufügen, um zu überprüfen, ob der Benutzer die Eingabe unvollständig gelassen hat, und ich würde empfehlen, eine weitere hinzuzufügen, um Aktionsereignisse abzufangen. Jetzt bin ich kein Herr mit regulären Ausdrücken, also sei nachsichtig xD. Hier ist meine Umsetzung:

class CustomField extends TextField { 

     public CustomField() { 
      super(); 
      textProperty().addListener(new ChangeListener<String>() { 
       @Override 
       public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
        if (newValue.isEmpty()) 
         return; 

        if (newValue.matches("\\d{1,2}|\\d{1,2}:|\\d{1,2}:[0-5]?[0-9]")) { 
         setText(newValue); 
        } else { 
         setText(oldValue); 
        } 
       } 
      }); 

      setOnAction(e -> { 
       if (!getText().matches("\\d{2}:\\d{2}")) { 
        setText(""); 
       } 
      }); 

      focusedProperty().addListener(new ChangeListener<Boolean>() { 
       @Override 
       public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, 
         Boolean newPropertyValue) { 
        if (!newPropertyValue) { 
         if (!getText().matches("\\d{2}:\\d{2}")) { 
          setText(""); 
         } 
        } 
       } 
      }); 
     } 
    } 

Während der Benutzer Schreib etwas das Textfeld alles, was Sie tun müssen, um zu überprüfen, ob sie die NN entspricht: XN (N = Anzahl 0-9 & X = Nummer 0-5) oder nur ein Teil davon. Wenn die Eingabe abgeschlossen ist, prüfen Sie, ob sie zu Ihrem Format passt und nur dann lassen Sie es zu, andernfalls setzen Sie den Textfeldinhalt auf "".

Natürlich ich sage nicht, dies ist der richtige Weg ist, oder am Besten, aber es ist ein ‚Problemumgehung‘ für Leute wie mich, die nicht wissen über die TextFormatter: P

+0

Ich möchte keine dumme Frage stellen, aber wie genau nenne ich es für mein 'textField'?Ich habe eine Klasse und ein neues Objekt mit dem Namen 'CustomField c1 = new CustomField();' erstellt. Aber was als nächstes zu tun? .. Wirklich neu in der Programmierung, btw ... –

+0

Nichts: P fügen Sie einfach den C1-Knoten zu Bühne und es wird nur Eingaben mit Ihrem Wunsch-Format akzeptieren (Wenn ich Sie richtig ofc verstehe) – JKostikiadis

+0

Ok, ich ein Problem gefunden. Ich bin ein Idiot. Ich habe die Validierung immer in meiner void-Methode aufgerufen, aber nicht im "void start". Das war der Grund, warum ich jedes Mal, wenn ich versuchte, eine Textvalidierung einzuführen, nicht funktionieren würde. Jetzt funktioniert es einwandfrei. Übrigens, vielen Dank für die Antwort. –