提问人:Thend 提问时间:3/28/2023 更新时间:3/28/2023 访问量:40
JFXtras CalendarPicker MouseEvent 行为不正常
JFXtras CalendarPicker MouseEvent does not behave properly
问:
我正在使用 JFXtras CalendarPicker 获取日历中多天的日期。我的项目是一个 JavaFX 项目,我使用的是 FXML,因为 CalendarPicker 链接到我的 Controller 类。详细地说,这是我的 FXML:
<CalendarPicker fx:id="calendarpicker" mode="MULTIPLE" />
在我的控制器类中,我在 initialize() 方法中使用了一个 EventHandler:
public void initialize() {
this.dateFormat = new SimpleDateFormat("yyyy-mm-dd");
calendarpicker.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getButton().equals(MouseButton.PRIMARY)) {
Calendar cal = calendarpicker.getCalendar();
if(cal != null){
String formattedDate = dateFormat.format(cal.getTime());
ObservableList<String> items = listview.getItems();
if (!items.contains(formattedDate)) {
items.add(formattedDate);
} else {
items.remove(formattedDate);
}
listview.setItems(items);
}
}
}
});
}
因此,在 JFXtras 中,日历中的 CalendarPicker 日期看起来像按钮,只需单击一下(按下按钮),但是当您释放它时,它不会出现。如果您再次单击按下的按钮,它将出现。我有一个 ListView(名为“listview”),我想用日期填充它,当我单击日历日时,它应该将日期添加到列表中。如果日期不在列表中,我想添加它。如果它已经在列表中(所以按钮已经按下),我再次单击它,它应该从列表中删除该日期。
问题是我的代码没有按预期运行,可能是因为这两个阶段的动作(按下并再次按下以出现)。我不知道如何解决它,所以我恳请帮助。
答:
4赞
James_D
3/28/2023
#1
没有必要自己实现这一切。公开表示所有选定实例的 an。只需将此列表用作您的支持列表:calendarPicker
ObservableList<Calendar>
Calendar
ListView
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import jfxtras.scene.control.CalendarPicker;
import java.io.IOException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Calendar;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
CalendarPicker calendarPicker = new CalendarPicker();
calendarPicker.setMode(CalendarPicker.Mode.MULTIPLE);
ListView<Calendar> dates = new ListView<>();
dates.setItems(calendarPicker.calendars());
dates.setCellFactory(lv -> new ListCell<>(){
private DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
@Override
protected void updateItem(Calendar item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText("");
} else {
setText(formatter.format(LocalDate.ofInstant(item.toInstant(), ZoneId.systemDefault())));
}
}
});
BorderPane root = new BorderPane(dates);
root.setTop(calendarPicker);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
评论
0赞
tbeernot
3/28/2023
谢谢你回答这个问题,詹姆斯!看看人们想出什么复杂的解决方案总是很有趣,而事实上,我试图让使用尽可能简单。
评论
ListView<Calendar>
calendarPicker.getCalendars()