我有这些代码用于从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.
});
...谢谢
答案 0 :(得分:0)
这可能不是很节省,每次DatePicker更新时都可能会中断。但我们假设没有发生:)
如果查看DatePicker的代码,可以看到它的结构大致是:
因此,我们可以编写一个函数来搜索 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>();