我想填充我在webview上绘制的FullCalendar,数据/事件日期存储在数据库中。
我知道我必须通过JSON这样做。问题是,实际上我在网上遇到的所有文档都只停留在“如何将JSON转换为Java对象”,反之亦然。如何在HTML / Java类中显示已转换的JSON / Java对象?
例如,假设我有一个从数据库中检索的事件/约会对象列表。
List<FullCalendarData> events = new ArrayList();
FullCalendarData
POJO课程:
@Component
@Entity
@Table(name = "ENTITY_OBJECT")
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
@Inheritance(strategy = InheritanceType.JOINED)
public class FullCalendarData {
private String eventName;
private String startTime;
private String endTime;
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
}
将List<FullCalendarData> events
从Java转换为JSON:
Gson gson = new Gson();
String jsonAppointment = gson.toJson(events);
现在的问题是,如何在下面的HTML \ webview中的FullCalendar中显示jsonAppointment
,或者换句话说,如何访问和迭代jsonAppointment
并使用它( jsonAppointment
)而不是下面的events
数组?
<!DOCTYPE html>
<html>
<head>
<link href='../fullcalendar/fullcalendar.css' rel='stylesheet' />
<link href='../fullcalendar/fullcalendar.print.css' rel='stylesheet' media='print' />
<script src='../lib/jquery.min.js'></script>
<script src='../lib/jquery-ui.custom.min.js'></script>
<script src='../fullcalendar/fullcalendar.min.js'></script>
<script>
$(document).ready(function() {
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
$('#calendar').fullCalendar({
editable: true,
events: [
{
title: 'All Day Event',
start: new Date(y, m, 1)
},
{
id: 999,
title: 'Repeating Event',
start: new Date(y, m, d + 4, 16, 0),
allDay: false
}
]
});
});
</script>
</head>
<body>
<div id='calendar'></div>
</body>
</html>
致电我们的网页浏览:
public class FullCalendarWebView {
public VBox calendar() {
final WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
engine.load("file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html");
JSObject script = (JSObject) engine.executeScript("window");
script.setMember("eventClick", new JavaApp().javaApp());
VBox vb = new VBox();
vb.getChildren().add(webView);
return vb;
}
}
答案 0 :(得分:1)
将单个活动发送到日历
为了从JavaFX向日历发送一些事件,首先你应该创建一个JavaScript函数,在日历上生成一个单独的事件:
private WebView webView;
private WebEngine engine;
private void createCalendar() {
webView = new WebView();
engine = webView.getEngine();
engine.load("file:D:/standAloneDev//src/fc/fullcalendarwebview/fullcalendar-1.6.4/demos/selectable.html");
engine.getLoadWorker().stateProperty().addListener((ov,oldState, newState)->{
if(newState==State.SUCCEEDED){
// JS to Java
JSObject script = (JSObject) engine.executeScript("window");
script.setMember("myClick", new JavaApp());
// Java to JS, function to create single event
engine.executeScript("function addEvent(title, start, end) {\n" +
"var eventData = {\n" +
" title: title,\n" +
" start: start,\n" +
" end: end\n" +
"};\n" +
"$('#calendar').fullCalendar('renderEvent', eventData, true);\n" +
"}");
}
});
}
现在我们可以在JavaFX应用程序上测试这个函数,用一些数据调用脚本:
@Override
public void start(Stage primaryStage) {
Button btn=new Button("Add Event");
btn.setOnAction(e->{
FullCalendarData data1=new FullCalendarData();
data1.setEventName("Event 1");
data1.setStartTime("2015-01-11T16:00:00");
data1.setEndTime("2015-01-11T18:00:00");
engine.executeScript("addEvent('"+data1.getEventName()+
"','"+data1.getStartTime()+
"','"+data1.getEndTime()+"');");
});
createCalendar();
Scene scene = new Scene(new VBox(webView,btn), 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
向日历发送事件列表
如果要使用JSON格式发送事件列表,可以创建另一个函数来处理列表,并在列表中的每个元素上调用addEvent()
:
engine.getLoadWorker().stateProperty().addListener((ov,oldState, newState)->{
if(newState==State.SUCCEEDED){
...
// Java to JS, send JSON list
engine.executeScript("function addListEvents(result) {\n" +
"for(var i=0; i<result.data.length; i++){\n" +
" addEvent(result.data[i].eventName, result.data[i].startTime, result.data[i].endTime);\n" +
"};\n" +
"}");
}
});
使用包装器作为事件列表:
class CalendarEvents{
final List<FullCalendarData> data=new ArrayList<>();
public List<FullCalendarData> getData() {
return data;
}
public void addEvent(FullCalendarData event) {
this.data.add(event);
}
}
我们可以检索事件列表,将其转换为JSON格式并调用此脚本:
@Override
public void start(Stage primaryStage) {
Button btn=new Button("Add Events");
btn.setOnAction(e->{
// list of random events
FullCalendarData data1=new FullCalendarData();
data1.setEventName("Event 1");
data1.setStartTime("2015-01-11T16:00:00");
data1.setEndTime("2015-01-11T18:00:00");
FullCalendarData data2=new FullCalendarData();
data2.setEventName("Event 2");
data2.setStartTime("2015-01-12T15:00:00");
data2.setEndTime("2015-01-12T18:00:00");
FullCalendarData data3=new FullCalendarData();
data3.setEventName("Event 3");
data3.setStartTime("2015-01-13T15:00:00");
data3.setEndTime("2015-01-1316:00:00");
CalendarEvents cal = new CalendarEvents();
cal.addEvent(data1);
cal.addEvent(data2);
cal.addEvent(data3);
Gson gson=new Gson();
String json=gson.toJson(cal,CalendarEvents.class);
engine.executeScript("addListEvents("+json+");");
});
createCalendar();
Scene scene = new Scene(new VBox(webView,btn), 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
您将在日历上显示您的活动: