Field validation text for the time format

Hi all

I have been breaking my head for almost 2 weeks, but am not able to figure it out... Please help me solve the riddle... here, it will:

In a text field, I want to perform an operation in the following way:

> a text default to 00:00:00 is defined at the moment as the text field is for the moment and the length in characters of the field is 8.

> if the cursor is in position 0 (zero) and if I press a number of key it should replace the value of the 0 position and move the cursor to the next position.

for example: 00:00:00

20:00

explanation : now the cursor is in position 0 and I press the 2 key it should replace the value 0 in position 0 and den move the cursor on the position 1 ie. next position...

When I press a button not digital it shouldn't replace the value, but the slider should move to the next position.

This seems to work ok. You need to test more, however. I've added a few properties for the hours, minutes and seconds as well.

import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.IntegerBinding;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.IndexRange;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TimeTextFieldTest extends Application {

 @Override
  public void start(Stage primaryStage) {
  VBox root = new VBox(5);
  root.setPadding(new Insets(5));
  Label hrLabel = new Label();
  Label minLabel = new Label();
  Label secLabel = new Label();
  TimeTextField timeTextField = new TimeTextField();
  hrLabel.textProperty().bind(Bindings.format("Hours: %d", timeTextField.hoursProperty()));
  minLabel.textProperty().bind(Bindings.format("Minutes: %d", timeTextField.minutesProperty()));
  secLabel.textProperty().bind(Bindings.format("Seconds: %d", timeTextField.secondsProperty()));

  root.getChildren().addAll(timeTextField, hrLabel, minLabel, secLabel);
  Scene scene = new Scene(root);
  primaryStage.setScene(scene);
  primaryStage.show();
  }

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

  }

  public static class TimeTextField extends TextField {

    enum Unit {HOURS, MINUTES, SECONDS};

    private final Pattern timePattern ;
    private final ReadOnlyIntegerWrapper hours ;
    private final ReadOnlyIntegerWrapper minutes ;
    private final ReadOnlyIntegerWrapper seconds ;

    public TimeTextField() {
      this("00:00:00");
    }
    public TimeTextField(String time) {
      super(time);
      timePattern = Pattern.compile("\\d\\d:\\d\\d:\\d\\d");
      if (! validate(time)) {
        throw new IllegalArgumentException("Invalid time: "+time);
      }
      hours = new ReadOnlyIntegerWrapper(this, "hours");
      minutes = new ReadOnlyIntegerWrapper(this, "minutes");
      seconds = new ReadOnlyIntegerWrapper(this, "seconds");
      hours.bind(new TimeTextField.TimeUnitBinding(Unit.HOURS));
      minutes.bind(new TimeTextField.TimeUnitBinding(Unit.MINUTES));
      seconds.bind(new TimeTextField.TimeUnitBinding(Unit.SECONDS));
    }

    public ReadOnlyIntegerProperty hoursProperty() {
      return hours.getReadOnlyProperty();
    }

    public int getHours() {
      return hours.get() ;
    }

    public ReadOnlyIntegerProperty minutesProperty() {
      return minutes.getReadOnlyProperty();
    }

    public int getMinutes() {
      return minutes.get();
    }

    public ReadOnlyIntegerProperty secondsProperty() {
      return seconds.getReadOnlyProperty();
    }

    public int getSeconds() {
      return seconds.get();
    }

    @Override
    public void appendText(String text) {
      // Ignore this. Our text is always 8 characters long, we cannot append anything
    }

    @Override
    public boolean deleteNextChar() {

      boolean success = false ;

      // If there's a selection, delete it:
      final IndexRange selection = getSelection();
      if (selection.getLength()>0) {
        int selectionEnd = selection.getEnd();
        this.deleteText(selection);
        this.positionCaret(selectionEnd);
        success = true ;
      } else {
        // If the caret preceeds a digit, replace that digit with a zero and move the caret forward. Else just move the caret forward.
      int caret = this.getCaretPosition();
      if (caret % 3 != 2) { // not preceeding a colon
        String currentText = this.getText();
        setText(currentText.substring(0, caret) + "0" + currentText.substring(caret+1));
        success = true ;
      }
      this.positionCaret(Math.min(caret+1, this.getText().length()));
      }
      return success ;
    }

    @Override
    public boolean deletePreviousChar() {

      boolean success = false ;

      // If there's a selection, delete it:
      final IndexRange selection = getSelection();
      if (selection.getLength()>0) {
        int selectionStart = selection.getStart();
        this.deleteText(selection);
        this.positionCaret(selectionStart);
        success = true ;
      } else {
      // If the caret is after a digit, replace that digit with a zero and move the caret backward. Else just move the caret back.
        int caret = this.getCaretPosition();
        if (caret % 3 != 0) { // not following a colon
          String currentText = this.getText();
          setText(currentText.substring(0, caret-1) + "0" + currentText.substring(caret));
          success = true ;
        }
        this.positionCaret(Math.max(caret-1, 0));
      }
      return success ;
    }

    @Override
    public void deleteText(IndexRange range) {
      this.deleteText(range.getStart(), range.getEnd());
    }

    @Override
    public void deleteText(int begin, int end) {
      // Replace all digits in the given range with zero:
      StringBuilder builder = new StringBuilder(this.getText());
      for (int c = begin; c 23) {
          return false ;
        }
        if (mins < 0 || mins > 59) {
          return false ;
        }
        if (secs < 0 || secs > 59) {
          return false ;
        }
        return true ;
      } catch (NumberFormatException nfe) {
        // regex matching should assure we never reach this catch block
        assert false ;
        return false ;
      }
    }

    private final class TimeUnitBinding extends IntegerBinding {

      final Unit unit ;
      TimeUnitBinding(Unit unit) {
        this.bind(textProperty());
        this.unit = unit ;
      }
      @Override
      protected int computeValue() {
        // Crazy enum magic
        String token = getText().split(":")[unit.ordinal()];
        return Integer.parseInt(token);
      }

    }

  }
}

Tags: Java

Similar Questions

Maybe you are looking for

  • How to manage 2 iphones

    I have 2 iphones with separate lines and one is for daily use and the other is for use of outdoor activities. My question is what is the best method to configure other phone as to causes no conflicts? I'll be maintaining one of these phones. Thank yo

  • Adding an external device

    How do you show your camera (connected via USB) in the Finder?

  • After the installation of Safari does not

    After you install the update to 10.11.3 when I open safari and try to type in the search bar nothing happens, if I put a url where it will take me on this site, but then I can't tape in this bar at most.

  • Startup error message: "Microsoft Mobile PC presentation adaptability Client has stopped working".

    I recently tried to install SP2 to Vista, but it failed. I tried all the resolutions posted, but it is not always correct it. Later, I started my Vista (automatically restored to SP1) and it came with a mistake, "Microsoft Mobile PC presentation adap

  • Server R2 2012 - don't click right button start - no logoff

    In Server R2 2012 there is no logoff when right click on the Start button.  I understand that logging using the Metro Interface (Start Menu), you can, but if you include stop and restart right on the start options button I'd logoff should be there as