如何从JavaFX中的DatePickerSkin获取值

时间:2016-08-29 13:27:47

标签: java javafx

我有这些代码用于从datepicker中提取datepickerskin并将其放在anchorpane中。它运作良好,但我的问题是我如何从中获得价值?比如,当你点击一个像8这样的数字并将值作为日期时,就像datepicker本身一样? 这是我的代码:zig8是anchopane。

 DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
 Region pop = (Region)datePickerSkin.getPopupContent();
 pop.setPrefHeight(zig8.getPrefHeight());
 pop.setPrefWidth(zig8.getPrefWidth());
 zig8.getChildren().add(pop);

我尝试以这种方式附加鼠标事件:

 pop.addEventHandler(MouseEvent.MOUSE_CLICKED,(e)->
 {
         //a code to get the value.

 });

...谢谢

1 个答案:

答案 0 :(得分:0)

这可能不是很节省,每次DatePicker更新时都可能会中断。但我们假设没有发生:)

如果查看DatePicker的代码,可以看到它的结构大致是:

  • DatePickerContent( VBox
    • MonthYearPane( BorderPane
    • GridPane
      • 包含按钮,类型为 DateCell

因此,我们可以编写一个函数来搜索 DatePicker 的内容,并找到所有 DateCells 。由于它们被重用,我们只需要这样做一次。然后,我们可以将事件监听器附加到每个 DateCell

    ...
    List<DateCell> dateCells = getAllDateCells(pop);
    DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
    DatePickerContent pop = (DatePickerContent)datePickerSkin.getPopupContent();
    pop.setPrefHeight(zig8.getPrefHeight());
    pop.setPrefWidth(zig8.getPrefWidth());
    zig8.getChildren().add(pop);

    List<DateCell> dateCells = getAllDateCells(pop);

    for (DateCell cell : dateCells)
    {
        cell.addEventHandler(
                MouseEvent.MOUSE_PRESSED,(e)->
                {
                    System.out.println("Mouse clicked :" + cell.getItem());
                }
        );
    }
    ...



 private static List<DateCell> getAllDateCells(DatePickerContent content)
 {
     List<DateCell> result = new ArrayList<>();

     for (Node n : content.getChildren())
     {
         System.out.println("node " + n + n.getClass());
         if (n instanceof GridPane)
         {
             GridPane grid = (GridPane) n;
             for (Node gChild : grid.getChildren())
             {
                 System.out.println("grid node: " + gChild + gChild.getClass());
                 if (gChild instanceof DateCell)
                 {
                     result.add((DateCell) gChild);
                 }
             }
         }
     }

     return result;
 }      

由于DateCell派生自Cell&lt;&gt;它知道它的当前日期,我们可以使用getItem来计算日期

<强>替代: 您可以通过使用Reflection来访问DatePickerContent中受保护的DateCell列表。

protected List<DateCell> dayCells = new ArrayList<DateCell>();