2017-10-01 2 views
-1

에 대한 addEventHandler에 대한 가이드가 없으므로 키 입력에서 실시간 유효성 검사를 수행하여 hh:mm 시간 형식 만 허용합니다. 이 표현식이 ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$인데 찾을 수는 없지만 eventHandler에 추가하는 방법을 모르겠습니다. 또한 simpleDateFormat을 사용하려고했지만 성공하지 못했습니다.javafx : javafx 텍스트 필드 용 addEventHandler를 사용하여 시간을 확인하는 방법

편집 : 나는 이런 식으로 뭔가를 만들기 위해 노력하고있어 (이 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(); 
      } 
     } 
    }); 

현재 자바 FX와 내가 만든 메인 piezimes.java. 마지막에 내가 .getText 그래서 내가 할 수있는 사용자 입력을 호출 버튼을 추가 곳 main.java에서 내가있는 tableView를 만든

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

}

그리고 : 제품 클래스에서 나는 내가 만들려는 객체를 정의합니다. 시간 유효성 확인을 통해서만 문제가 생깁니다. 지금 테이블에 사용자 입력을 추가하는 방법은 다음과 같습니다. piezimes.setLaiks(laiksIevade.getText());

+0

에 https : // 유래. com/questions/31039449/java-8-u40-textformatter-javafx-to-restrict-user-only-for-decimal-number https://stackoverflow.com/a/12851162/2189127 –

+0

@James_D 모두 시도했습니다. 내 프로그램에서 작동하지 않습니다 ... –

+0

시도한 것을 보여주고 작동하지 않는 방식으로 설명하는 질문을 다시 작성해야합니다. [MCVE]를 제공하십시오. 연결된 질문은 올바른 방법을 제공합니다. –

답변

-1

사실 TextFormatter에 익숙하지 않습니다. 매번이 작업을 수행 할 때마다 textProperty에 changeListener를 추가하고 사용자 입력이 정규식과 일치하는지 확인하는 사용자 지정 TextField를 수행하고 있습니다. 이제 상황에 따라 사용자가 불완전한 입력을 남겼는지 확인하기 위해 적어도 하나 이상의 focusProperty를 추가해야하고 액션 이벤트를 잡기 위해 하나 더 추가하는 것이 좋습니다. 이제는 정규 표현식을 사용하는 주인이 아니므로 관대 한 xD가되어야합니다. 여기 내 구현 :

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

텍스트 필드에 대한 사용자 쓰기 뭔가 당신이 할 필요가 NN과 일치하는지 확인하는 것입니다 동안 : XN (N = 수를 & X = 숫자 0-5 0-9) 또는 그것의 단지 일부. 입력이 완료되면 형식과 일치하는지 확인한 다음 텍스트 필드 내용을 ""로 설정합니다. 물론

나는 이것이 올바른 방법 또는 최선의 하나입니다 말하고 있지 않다, 그러나 TextFormatter 모르는 나 같은 사람들을위한 '해결 방법'입니다 : P

+0

어리석은 질문을하고 싶지는 않지만 내'textField'에 대해 정확히 어떻게 호출해야합니까?나는'CustomField c1 = new CustomField();'라는 클래스와 새로운 객체를 생성했다. 하지만 다음에해야할 일은 ... 프로그래밍에 익숙하지 않은 것입니다 ... –

+0

아무것도 : P는 단지 c1 노드를 무대에 추가하고 원하는 형식으로 입력을 받아 들일 것입니다 (만약 내가 올바른 경우). – JKostikiadis

+0

좋아, 나 문제를 발견했습니다. 나는 바보 야. 나는 항상 void 메쏘드에서 유효성 검사를 호출하고 있었지만'void start'에서는 검증을 호출하지 않았습니다. 그래서 언제든지 텍스트 유효성 검사를 입력하려고 할 때마다 작동하지 않습니다. 이제 완벽하게 작동합니다. Btw, 대답 해줘서 고마워. –