2016-09-12 2 views
0

DateTimeField의 사용자 선택 값을 가져 오려고하지만 실패합니다. 나는 현재 내 DropDownChoice 오브젝트에 대해 완벽하게 작동합니다 다음 코드를 가지고 :wicket에서 사용자 입력 받기 DateTimeField

public class DateTimeFieldPanel extends Panel { 

    private final Date date; 
    private String value; 

    public DateTimeFieldPanel(Date date) { 
     super("component"); 
     this.date = date; 

     final DateTimeField dateTimeField = new DateTimeField("dateTimeField", new PropertyModel<Date>(this, "date")); 

     dateTimeField.add(new AjaxFormComponentUpdatingBehavior("onchange") { 

      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
       value = dateTimeField.getModel().getObject().toString(); 
      } 
     }); 

     add(dateTimeField); 
    } 

    public Date getDate() { 
     return date; 
    } 
} 

문제는으로 getObject()가 null를 돌려 있도록 모델이 어떤 이유로 객체가없는 것입니다. 내가 뭘 잘못하고 있니? 왜 이것이 DropDownChoicePanel에서 작동 하나 DateTimeField에서 작동하지 않습니까?

감사합니다.

업데이트 :

dateTimeField = new DateTimeField("dateTimeField", new PropertyModel<Date>(this, "date")) { 

     @Override 
     protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { 
      final DateTextField dateField = super.newDateTextField(id, dateFieldModel); 
      dateField.add(new AjaxFormComponentUpdatingBehavior("change") { 

       @Override 
       protected void onUpdate(AjaxRequestTarget target) { 
        processInput(); 
       } 
      }); 
      return dateField; 

     } 

     @Override 
     protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) { 
      final TextField<Integer> hoursTextField = new TextField<Integer>(id, model, type); 
      hoursTextField.add(new AjaxFormComponentUpdatingBehavior("change") { 

       @Override 
       protected void onUpdate(AjaxRequestTarget target) { 
        processInput(); 
       } 
      }); 

      hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator.range(1, 12)); 
      hoursTextField.setLabel(new Model<String>(HOURS)); 
      return hoursTextField; 
     } 

     private int getMaximumHours() { 
      return getMaximumHours(use12HourFormat()); 
     } 

     private int getMaximumHours(boolean use12HourFormat) { 
      return use12HourFormat ? 12 : 24; 
     } 

     @Override 
     protected boolean use12HourFormat() { 
      String pattern = DateTimeFormat.patternForStyle("-S", getLocale()); 
      return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1 || pattern.indexOf('K') != -1; 
     } 
    }; 

는 기본적으로 나는 DateTimeField 세 TextField의 날짜, 시간 및 분에 대해 하나의 구성 것을 알아 냈 : 지금이 혼란 있습니다. 이 필드에 ajax 동작을 별도로 추가하는 대신 해당 메서드를 재정의 한 다음 processInput() 메서드를 호출하여 DateTimeField의 ModelObject가 업데이트되도록해야합니다. 이것은 날짜 부분에 적용됩니다. 몇 시간 동안 필드를 만드는 메서드를 재정의 할 수 있지만 processInput()을 호출하면 DateTimeField에 대한 ModelObject가 업데이트되지 않는 것처럼 보입니다. 마지막으로, 가장 큰 문제는 분 동안 필드를 만드는 방법이 없다는 것입니다. 그러므로 나는 그것을 우선 무시할 수 없다. 나는이 방법이 너무 복잡하다고 생각하지만, 나는 어디로 잘못 가고있는가?

도움을 주시면 감사하겠습니다.

답변

0

왜 문서가 AjaxFormComponentUpdatingBehavior을 가리키는 지 잘 모르겠습니다.

여기서 문제는 변경되는 경우 각 필드의 내용 만 업데이트한다는 것입니다. 따라서 minutes 필드가 변경되면 minuteField 입력 만 POST합니다. 따라서 분/시간 업데이트 후 입력을 변환하려고 할 때마다 날짜를 찾지 못하고 실패합니다.

참조 DateTimeField.convertInput

  // Get the converted input values 
     Date dateFieldInput = dateField.getConvertedInput(); 
     Integer hoursInput = hoursField.getConvertedInput(); 
     Integer minutesInput = minutesField.getConvertedInput(); 
     AM_PM amOrPmInput = amOrPmChoice.getConvertedInput(); 

     if (dateFieldInput == null) 
     { 
      return; 
     } 

내가 좋아하는 형태로 DateTimeField 포장 그냥 변경 이벤트 기간 동안 전체 양식을 추천 할 것입니다 :

final Form<?> form = new Form("form"); 
    add(form); 

    IModel<Date> dateModel = Model.of(); 
    DateTimeField dateTimeField = new DateTimeField("dateTimeField", dateModel) { 

     @Override 
     protected DateTextField newDateTextField(String id, PropertyModel dateFieldModel) { 
      DateTextField dateField = super.newDateTextField(id, dateFieldModel); 
      dateField.add(new AjaxFormSubmitBehavior(form, "change") { 
      }); 
      return dateField; 

     } 

     @Override 
     protected TextField<Integer> newMinutesTextField(String id, IModel<Integer> model, Class<Integer> type) { 
      TextField<Integer> textField = super.newMinutesTextField(id, model, type); 
      textField.add(new AjaxFormSubmitBehavior(form, "change") { 
      }); 

      return textField; 
     } 

     @Override 
     protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) { 
      TextField<Integer> textField = super.newHoursTextField(id, model, type); 
      textField.add(new AjaxFormSubmitBehavior(form, "change") { 
      }); 
      return textField; 
     } 
    }; 
    form.add(dateTimeField); 

이 실제로 세 가지를 모두 제출 값을 하나만 사용하는 대신 모든 것이 효과가 있습니다.

+0

안녕하세요. Thorsten, 제 질문에 답변 해 주셔서 감사합니다. 나는 2 개의 질문으로 떠났다. 가장 중요한 점은 앞에서 설명한 것처럼 newMinutesTextField() 메서드가 존재하지 않으므로 재정의 할 수 없습니다. 둘째로 (중요하지 않음) :이 솔루션은 여전히 ​​모든 값을 별도로 제출하는 것으로 보입니다. 필드 중 하나 (날짜, 시간 또는 분)를 업데이트 한 후에는 양식 제출이 시작됩니다. 그래서 날짜를 입력하고 시간을 입력하기 시작하면 날짜가 이미 제출되었습니다. 그러나 이것은 내가 코딩 할 수있는 것이므로 큰 문제는 아닙니다. –

+0

사과, 방금 널 값을 확인하는 부분을 간과 한 것 같습니다. 그러나 가장 큰 문제는 여전히 남아 있습니다. 또한 DateTimeField가 폼의 일부가 아니더라도 null 값을 확인할 수 있으므로 양식에 모든 것을 추가하는 이점이 확실하지 않습니다. –

+0

양식을 추가 한 주된 이유는 3 가지 값 (날짜, 시간, 분)을 제출하는 것이었기 때문입니다.이 문제를 해결하기 위해 더 큰 양식이 필요할 수도 있고 모든 것이 제출되기를 원할 수도 있습니다. FormComponent 주위에 하나의 Form이 있어야합니다. 어떤 개찰판 버전을 사용하고 있습니까? 마지막 개찰구가있는 코드를 테스트했습니다.x 버전 및 newMinutesTextField() 메서드가 있습니다 –