2014-09-09 5 views
0

나는 DatePicker와 매우 흡사하게 동작하는 내 자신의 TimePicker를 만들었습니다. 시간을 선택하고 PopupWindow에서 확인하는 것과 같은 이벤트를 처리하는 가장 좋은 방법을 알고 싶습니다. 내가 할 수있는PopupWindow 내에서 이벤트 처리하기

:

  • 내 TimePicker의 팝업 노드 (별도의 FXML 및 컨트롤러) 인터페이스를 정의하고 선택한 날짜를 처리하는 방법을 구현하기 위해 TimePicker의 부모를 강제합니다. (나는 이런 방식으로 인터페이스를 사용하는 것을 피하고 싶습니다. 일을하는 데 끔찍한 방법처럼 보입니다.)
  • 팝업 윈도우에 사용자 정의 EventHandler와 리스너를 등록 하시겠습니까? 그런 다음 PopupWindow에서 날짜를 선택한 후 확인을 클릭하면 모든 이벤트가 TimePicker까지 실행됩니다.
  • 콜백과 같은 기능을 구현하십시오. 예를 들어 안드로이드에서는 다른 화면으로 이동하여 결과를 검색 할 수있는 옵션이 있습니다. JavaFX에 이런 종류의 것이 있는지 확실하지 않습니다. 화면은 서로 상당히 분리되어 있습니다.
+0

왜 그냥 속성을 노출 :

여기 DatePicker 사용 개념의 증거인가? –

+0

그럴 수 있다고 생각합니다. 예를 들어'BooleanProperty가 확인되었습니다. ' Popup에서 OKAY를 치면 confirm이 true로 설정되고 TimePicker의 리스너가 응답합니다. 그러나 확인 된 자산을 다시 거짓으로 재설정해야합니까? 편집 : 또는 TimePickerClockPopup의 현재 'ObjectProperty 값'을 노출하는 것이 더 쉬울 것입니다. –

+0

방금 ​​ObjectProperty 을 의미했습니다. 사용자가 선택을 확인하고 팝업을 숨길 때 설정하십시오. 그런 다음 변경 사항을 관찰 할 수 있습니다. –

답변

3

값을 나타내는 ReadOnlyProperty이 표시됩니다. 팝업을 사용하는 사용자는 속성을 관찰 할 수 있습니다.

import java.time.LocalDate; 

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectProperty; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.geometry.Bounds; 
import javafx.geometry.Insets; 
import javafx.geometry.Point2D; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.DatePicker; 
import javafx.scene.control.Label; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.stage.Popup; 
import javafx.stage.PopupWindow; 
import javafx.stage.Stage; 


public class DatePickerPopupExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Label dateLabel = new Label(LocalDate.now().toString()); 
     Button changeButton = new Button("Change"); 

     HBox root = new HBox(5, dateLabel, changeButton); 
     root.setAlignment(Pos.CENTER); 

     changeButton.setOnAction(event -> { 
      DatePickerPopup popup = new DatePickerPopup(); 
      popup.valueProperty().addListener((obs, oldDate, newDate) -> { 
       dateLabel.setText(newDate.toString()); 
      }); 
      Bounds buttonBds = changeButton.getBoundsInLocal(); 
      Point2D loc = changeButton.localToScreen(buttonBds.getMaxX(), buttonBds.getMinY()); 
      popup.showPopup(primaryStage, loc.getX(), loc.getY()); 
     }); 

     Scene scene = new Scene(root, 250, 150); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public class DatePickerPopup { 
     private final ReadOnlyObjectWrapper<LocalDate> value = new ReadOnlyObjectWrapper<>(); 

     private final Popup popup ; 

     public ReadOnlyObjectProperty<LocalDate> valueProperty() { 
      return value.getReadOnlyProperty(); 
     } 

     public final LocalDate getValue() { 
      return valueProperty().get(); 
     } 
     public DatePickerPopup(LocalDate date) { 

      value.set(date); 

      DatePicker picker = new DatePicker(date); 
      Button okButton = new Button("OK"); 
      okButton.setOnAction(event -> { 
       popup.hide(); 
       value.set(picker.getValue()); 
      }); 
      Button cancelButton = new Button("Cancel"); 
      cancelButton.setOnAction(event -> { 
       popup.hide(); 
      }); 

      BorderPane root = new BorderPane(); 
      root.setCenter(picker); 
      HBox buttons = new HBox(5, okButton, cancelButton); 
      buttons.setPadding(new Insets(5)); 
      buttons.setAlignment(Pos.CENTER); 
      root.setBottom(buttons); 

      popup = new Popup(); 
      popup.getContent().add(root); 
     } 

     public DatePickerPopup() { 
      this(LocalDate.now()); 
     } 

     public void showPopup(Stage owner, double x, double y) { 
      popup.show(owner, x, y); 
     } 
    } 

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