- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 DatePicker,来自 javafx 导入。但是我需要它包含 Calendar 属性,这就是为什么我制作了一个扩展 DatePicker 的自定义控件。
但是,每次更改日期选择器时,它都应该调用此属性,这就是为什么我认为在执行 onAction 事件时必须使用 .notify 方法。这会引发 java.lang.IllegalMonitorStateException
异常。
这是我用于此自定义控件的代码:
public class DatePickerControl extends DatePicker
{
private ObjectProperty<Calendar> calendar;
public DatePickerControl() {
super();
setValue(LocalDate.now());
}
/**
* Get the value of calendar
*
* @return the value of calendar
*/
public ObjectProperty<Calendar> calendarProperty() {
Calendar calendar = new GregorianCalendar();
System.out.println("test");
calendar.set(getValue().getYear(), getValue().getMonthValue(), getValue().getDayOfMonth());
return new SimpleObjectProperty<>(calendar);
}
/**
* Set the value of calendar
*
* @param calendar new value of calendar
*/
public void setCalendar(Calendar calendar) {
this.calendar.set(calendar);
LocalDate ld = LocalDate.now();
ld.withYear(calendar.get(Calendar.YEAR));
ld.withMonth(calendar.get(Calendar.MONTH));
ld.withDayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
setValue(ld);
}
public Calendar getCalendar() {
return calendar.get();
}
}
以及我调用 .notify() 的地方:
dpAgendaRange.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
t.notify();
}
});
我是 JavaFX 新手,所以如果代码不是很结构化,我深表歉意。
最佳答案
首先,notify()
不做你认为它做的事。它是低级并发 API 的一部分,负责唤醒处于 wait() 阻塞状态的线程。您可以阅读此内容 here尽管这与您想要做的事情无关。
我认为您想要做的是拥有 ObjectProperty<Calendar>
它始终与 DatePicker
中的日期值匹配的valueProperty
.
为此,只需定义 ObjectProperty<Calendar>
以通常的方式:即仅创建一次,并有 setCalendar(...)
设置其值的方法,a getCalendar()
获取其值的方法,以及 calendarProperty()
返回属性本身的方法。
维持 ObjectProperty<Calendar>
之间的绑定(bind)和 valueProperty
DatePicker
的,只需为每个监听器注册一个监听器,并在其中一个发生更改时更新另一个监听器。
(另请注意,LocalDate 和 Calendar 之间的月份编号不同。)
所以像这样:
public class DatePickerControl extends DatePicker {
private ObjectProperty<Calendar> calendar;
private DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_DATE ;
private Format calendarFormatter = DateFormat.getDateInstance();
public DatePickerControl() {
super();
setValue(LocalDate.now());
calendar = new SimpleObjectProperty<Calendar>(Calendar.getInstance());
calendar.addListener((obs, oldValue, newValue) -> {
System.out.println("calendar changed from "+calendarFormatter.format(oldValue.getTime())+" to "+calendarFormatter.format(newValue.getTime()));
LocalDate localDate = LocalDate.now()
.withYear(newValue.get(Calendar.YEAR))
.withMonth(newValue.get(Calendar.MONTH)+1)
.withDayOfMonth(newValue.get(Calendar.DAY_OF_MONTH));
setValue(localDate);
});
valueProperty().addListener((obs, oldValue, newValue) -> {
System.out.println("Value changed from "+dateFormatter.format(oldValue)+" to "+dateFormatter.format(newValue));
Calendar cal = Calendar.getInstance();
cal.set(getValue().getYear(), getValue().getMonthValue()-1, getValue().getDayOfMonth());
calendar.set(cal);
});
}
public ObjectProperty<Calendar> calendarProperty() {
return calendar;
}
public void setCalendar(Calendar calendar) {
this.calendar.set(calendar);
}
public Calendar getCalendar() {
return calendar.get();
}
}
一个简单的测试:
import java.text.DateFormat;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
VBox root = new VBox();
Scene scene = new Scene(root,400,400);
DatePickerControl datePicker = new DatePickerControl();
Label label = new Label();
final DateFormat calFormatter = DateFormat.getDateInstance() ;
datePicker.calendarProperty().addListener((obs, oldValue, newValue) -> label.setText(calFormatter.format(newValue.getTime())));
root.getChildren().addAll(datePicker, label);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
关于java - 尝试制作自定义控件,需要在值发生更改时发出通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892018/
如何从 BroadcastReceiver 发出通知(不能使用大多数方法,也不能使用“this”)?我需要它来打开一个包含数据库信息的 Activity 我已经做到了,但现在必须的方法不起作用,我不能
所以基本上我会更新我的应用程序的 GUI,所以我使用静态方法 void javax.swing.SwingUtilities.invokeLater(Runnable doRun) 但我希望将初始化代
curl_setopt_array( $ch, $curl_opt ); 这段代码给出了一个通知 Notice: Array to string conversion in ... 这是 $curl_
我正在用 PHP 构建一个网站,以 JSON 格式处理 Redis 中的 session 。 这样 PHP 解释器和 Node.js 服务器都可以访问 session 。 我现在想做的是在所述网站中添
我想在单击“添加到购物车”时使用 ajax laravel 发出通知,并且通知成功或失败。 这是我的ajax脚本 $('#formCart').on('click','.add_cart_b
我是一名优秀的程序员,十分优秀!