首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DatePickerSkin中在JavaFX中获取值

如何在DatePickerSkin中在JavaFX中获取值
EN

Stack Overflow用户
提问于 2016-08-29 13:27:47
回答 1查看 765关注 0票数 0

我有这些代码,用于从数据采集器中提取数据采集器皮肤,并将其放置在一个锚窗格中。它运行良好,但我的问题是,我如何从它的价值?比方说,当你点击一个像8这样的数字,得到一个日期的值,就像数据报器本身一样?这是我的代码: zig8是主链。

代码语言:javascript
复制
 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);

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

代码语言:javascript
复制
 pop.addEventHandler(MouseEvent.MOUSE_CLICKED,(e)->
 {
         //a code to get the value.

 });

谢谢..。

EN

回答 1

Stack Overflow用户

发布于 2016-08-30 14:48:36

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

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

  • DatePickerContent (VBox)
    • MonthYearPane (BorderPane)
    • GridPane
      • 包含DateCell类型的按钮。

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

代码语言:javascript
复制
    ...
    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<>派生的,所以它知道它的当前日期,我们可以使用getItem来计算日期。

Alternative:您可能可以通过使用反射访问DatePickerContent中的受保护的DateCell列表。

代码语言:javascript
复制
protected List<DateCell> dayCells = new ArrayList<DateCell>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39207507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档