JFXtras CalendarPicker MouseEvent 行为不正常

JFXtras CalendarPicker MouseEvent does not behave properly

提问人:Thend 提问时间:3/28/2023 更新时间:3/28/2023 访问量:40

问:

我正在使用 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”),我想用日期填充它,当我单击日历日时,它应该将日期添加到列表中。如果日期不在列表中,我想添加它。如果它已经在列表中(所以按钮已经按下),我再次单击它,它应该从列表中删除该日期。

问题是我的代码没有按预期运行,可能是因为这两个阶段的动作(按下并再次按下以出现)。我不知道如何解决它,所以我恳请帮助。

javaFX 日历 mouseevent mouselistener jfxtras

评论

0赞 James_D 3/28/2023
为什么不直接使用 a 并将项目设置为 ?然后它应该自动更新,而不是编写所有这些代码来重新发明轮子。ListView<Calendar>calendarPicker.getCalendars()
0赞 Thend 3/28/2023
@James_D 不幸的是,这行不通。当我取消按日历中的实际日期时,它不会从列表视图中删除日历。我可以请你试试吗?
0赞 James_D 3/28/2023
对我来说效果很好。也许我误解了你想做什么。
0赞 Thend 3/28/2023
@James_D工作得很好,不幸的是我把它弄得太复杂了。感谢您的帮助!谢谢! :)

答:

4赞 James_D 3/28/2023 #1

没有必要自己实现这一切。公开表示所有选定实例的 an。只需将此列表用作您的支持列表:calendarPickerObservableList<Calendar>CalendarListView

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
谢谢你回答这个问题,詹姆斯!看看人们想出什么复杂的解决方案总是很有趣,而事实上,我试图让使用尽可能简单。