· 10 years ago · Sep 12, 2016, 08:54 PM
1//Main.java
2package sample;
3
4import javafx.application.Application;
5import javafx.fxml.FXMLLoader;
6import javafx.scene.Parent;
7import javafx.scene.Scene;
8import javafx.stage.Stage;
9
10public class Main extends Application {
11 @Override
12 public void start(Stage primaryStage) throws Exception {
13 Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));
14 primaryStage.setTitle("Organize your time!");
15 primaryStage.setScene(new Scene(root));
16 primaryStage.show();
17
18
19
20 }
21
22 public static void main(String[] args) {
23 launch(args);
24 }
25
26}
27
28//DatabaseClass.java
29
30package resources;
31
32import java.sql.*;
33import java.sql.Connection;
34import java.sql.DriverManager;
35import java.sql.PreparedStatement;
36import java.sql.SQLException;
37import java.sql.Statement;
38import java.time.Instant;
39import java.time.ZoneId;
40import java.time.ZonedDateTime;
41import java.util.ArrayList;
42import static java.sql.Statement.RETURN_GENERATED_KEYS;
43
44public class DatabaseClass {
45
46 private static final String DRIVER = "org.sqlite.JDBC";
47 private Connection connection;
48
49 public DatabaseClass() {
50
51 try {
52 Class.forName(DatabaseClass.DRIVER);
53 } catch(ClassNotFoundException e) {
54 System.err.println("Driver JDBC couldn't be loaded");
55 e.printStackTrace();
56 }
57 try {
58 String databaseName = "jdbc:sqlite:organiser.db";
59 connection = DriverManager.getConnection(databaseName);
60
61 } catch(SQLException e) {
62 System.err.println("Error server connection");
63 e.printStackTrace();
64 }
65
66 createTables();
67 }
68
69 private void createTables() {
70
71 try {
72 Statement statement = connection.createStatement();
73 String sqlString = "CREATE TABLE IF NOT EXISTS Events(id_Event INTEGER PRIMARY KEY AUTOINCREMENT, date_of_event date, description varchar(255))";
74 statement.execute(sqlString);
75 } catch(SQLException e) {
76 System.err.println("Failed to create MyEvent");
77 e.printStackTrace();
78 }
79
80 }
81
82 private ZonedDateTime fromSQLDateToZonedDateTime(Date date){
83 return ZonedDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
84 }
85
86 private Date fromZonedDateTimeToSQLDate(ZonedDateTime zonedDateTime){
87 long millis = zonedDateTime.toInstant().toEpochMilli();
88 return new Date(millis);
89 }
90
91 public void insertEvent(Event event) {
92 try {
93 Date sqlDate = fromZonedDateTimeToSQLDate(event.getZonedDateTime());
94 String description = event.getDescription();
95 PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO Events VALUES(NULL, ?,?)", RETURN_GENERATED_KEYS);
96 preparedStatement.setDate(1, sqlDate);
97 preparedStatement.setString(2, description);
98 preparedStatement.execute();
99 try{
100 ResultSet generatedKey = preparedStatement.getGeneratedKeys();
101 if(generatedKey.next()){
102 event.setId(generatedKey.getInt(1));
103 }
104 }catch(SQLException e){
105 System.err.println("Failed to find id");
106 e.printStackTrace();
107 }
108
109 } catch(SQLException e) {
110 System.err.println("Failed to add myEvent");
111 e.printStackTrace();
112 }
113 }
114
115 public ArrayList<Event> selectAllEvents() {
116 ArrayList<Event> arrayOfMyEvent;
117 arrayOfMyEvent = new ArrayList<Event>();
118 try {
119 Statement statement = connection.createStatement();
120 ResultSet result = statement.executeQuery("SELECT * FROM Events");
121 while (result.next()) {
122 Event event = new Event();
123 Date date = result.getDate("date_of_event");
124 event.setZonedDateTime(fromSQLDateToZonedDateTime(date));
125 event.setDescription(result.getString("description"));
126 event.setId(result.getInt("id_Event"));
127 arrayOfMyEvent.add(event);
128 }
129 } catch(SQLException e) {
130 System.err.println("Failed to select events");
131 e.printStackTrace();
132 return null;
133 }
134 return arrayOfMyEvent;
135 }
136
137 public void deleteAllEvents() {
138
139 try {
140 PreparedStatement preparedStatement = connection.prepareStatement("DELETE from Events");
141 preparedStatement.execute();
142 } catch(SQLException e) {
143 e.printStackTrace();
144 System.err.println("Failed to delete records");
145 }
146 }
147
148 public Event selectEventById(int id){
149 Event event = new Event();
150 try{
151 Statement statement = connection.createStatement();
152 ResultSet result = statement.executeQuery("SELECT * FROM Events WHERE id_Event = " + id);
153 Date date = result.getDate("date_of_event");
154 event.setZonedDateTime(fromSQLDateToZonedDateTime(date));
155 event.setDescription(result.getString("description"));
156 event.setId(result.getInt("id_Event"));
157
158 }catch(SQLException e){
159 e.printStackTrace();
160 System.err.println("Failed to select record");
161 return null;
162 }
163 return event;
164 }
165
166 public void deleteEventById(int id){
167 try {
168 PreparedStatement preparedStatement = connection.prepareStatement("DELETE from Events WHERE id_Event = " + id);
169 preparedStatement.execute();
170 }catch(SQLException e){
171 e.printStackTrace();
172 System.err.println("Failed to delete record");
173 }
174 }
175
176 public void closeDatabaseConnection() {
177 try {
178 connection.close();
179 } catch(SQLException e) {
180 e.printStackTrace();
181 System.err.println("Error while trying to close connection");
182 }
183 }
184}
185
186//Event.java
187
188package resources;
189
190import java.time.ZonedDateTime;
191
192public class Event {
193 private ZonedDateTime zonedDateTime;
194 private String description;
195 private int id;
196
197 public Event(){
198 this.zonedDateTime = ZonedDateTime.now();
199 this.description = "no description";
200 }
201
202 public Event(String description, ZonedDateTime zonedDateTime) {
203 this.zonedDateTime = zonedDateTime;
204 this.description = description;
205 }
206
207 public ZonedDateTime getZonedDateTime() {
208 return zonedDateTime;
209 }
210
211 public String getDescription() {
212 return description;
213 }
214
215 public void setZonedDateTime(ZonedDateTime zonedDateTime) {
216 this.zonedDateTime = zonedDateTime;
217 }
218
219 public void setDescription(String description) {
220 this.description = description;
221 }
222
223 public void setId(int id){
224 this.id = id;
225 }
226
227 public int getId(){
228 return id;
229 }
230
231 @Override
232 public String toString() {
233 return zonedDateTime + " " + description;
234 }
235
236 @Override
237 public boolean equals(Object o) {
238 if (this == o) return true;
239 if (!(o instanceof Event)) return false;
240
241 Event event = (Event) o;
242
243 return getId() == event.getId() && !(getZonedDateTime() != null ? !getZonedDateTime().equals(event.getZonedDateTime()) : event.getZonedDateTime() != null) &&
244 !(getDescription() != null ? !getDescription().equals(event.getDescription()) : event.getDescription() != null);
245
246 }
247
248 @Override
249 public int hashCode() {
250 int result = getZonedDateTime() != null ? getZonedDateTime().hashCode() : 0;
251 result = 31 * result + (getDescription() != null ? getDescription().hashCode() : 0);
252 result = 31 * result + getId();
253 return result;
254 }
255}
256
257//Controller.java
258
259package sample;
260
261import com.sun.javafx.scene.control.skin.DatePickerSkin;
262import javafx.collections.FXCollections;
263import javafx.collections.ObservableList;
264import javafx.fxml.FXML;
265import javafx.geometry.Pos;
266import javafx.scene.Node;
267import javafx.scene.Scene;
268import javafx.scene.control.*;
269import javafx.scene.layout.BorderPane;
270import javafx.scene.layout.VBox;
271import javafx.scene.text.Text;
272import javafx.scene.text.TextAlignment;
273import javafx.stage.Stage;
274import java.io.IOException;
275import java.text.ParseException;
276import java.text.SimpleDateFormat;
277import java.time.Instant;
278import java.time.LocalDate;
279import java.time.ZoneId;
280import java.time.ZonedDateTime;
281import java.util.ArrayList;
282import java.util.Date;
283import resources.DatabaseClass;
284import resources.Event;
285
286public class Controller {
287
288 private DatabaseClass databaseClass = new DatabaseClass();
289 private ObservableList<Event> items = FXCollections.observableArrayList();
290 private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd, HH:mm");
291 Date date;
292 @FXML
293 public TextField descriptionField;
294 @FXML
295 public TextField zonedDateTimeField;
296 @FXML
297 public ListView<Event> listView;
298 @FXML
299 public MenuItem deleteMenuItem;
300 @FXML
301 public ContextMenu contextMenuOfListView;
302 public DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
303 public Node popupContent = datePickerSkin.getPopupContent();
304 @FXML
305 BorderPane borderPane = new BorderPane();
306
307
308
309 @FXML
310 public void showErrorDateFormatBox() throws IOException {
311
312 Text errorMessage = new Text("Wrong date format");
313 Stage errorStage = new Stage();
314 VBox errorVBox = new VBox(20);
315 errorVBox.getChildren().add(errorMessage);
316 errorVBox.setAlignment(Pos.CENTER);
317 Scene errorScene = new Scene(errorVBox,200,100);
318 errorStage.setScene(errorScene);
319
320 String dateString = zonedDateTimeField.getText();
321 String descriptionString = descriptionField.getText();
322 try {
323 date = simpleDateFormat.parse(dateString);
324 } catch (ParseException e) {
325 errorStage.show();
326 }
327 ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
328 Event event = new Event(descriptionString, zonedDateTime);
329 databaseClass.insertEvent(event);
330 items.add(event);
331 listView.setItems(items);
332 }
333
334 @FXML
335 public void showAboutBox() {
336 Stage popupStage = new Stage();
337 VBox vBox = new VBox(20);
338 Text text = new Text("Made by Rafał Wiensko");
339 text.setTextAlignment(TextAlignment.CENTER);
340 vBox.getChildren().add(text);
341 vBox.setAlignment(Pos.CENTER);
342 Scene popupScene = new Scene(vBox, 300, 200);
343 popupStage.setScene(popupScene);
344 popupStage.show();
345 }
346
347 @FXML
348 public void loadEvents(){
349 listView.getItems().clear();
350 ArrayList<Event> myEventArrayList = databaseClass.selectAllEvents();
351 for(Event event: myEventArrayList) {
352 items.add(event);
353 }
354 listView.setItems(items);
355 }
356
357 @FXML
358 public void deleteAllEventsFromListView() {
359 databaseClass.deleteAllEvents();
360 listView.getItems().clear();
361 }
362
363 @FXML
364 public void deleteEventByIdFromListView(){
365 databaseClass.deleteEventById(listView.getSelectionModel().getSelectedItem().getId());
366 loadEvents();
367 }
368
369 @FXML
370 public void quit() {
371 databaseClass.closeDatabaseConnection();
372 Runtime.getRuntime().exit(0);
373 }
374}
375
376//sample.fxml
377
378<?xml version="1.0" encoding="UTF-8"?>
379
380<?import javafx.scene.control.*?>
381<?import javafx.scene.layout.*?>
382
383<GridPane alignment="CENTER" hgap="10.0" prefHeight="676.0" prefWidth="714.0" vgap="10.0"
384 xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="sample.Controller">
385 <columnConstraints>
386 <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0"/>
387 </columnConstraints>
388 <rowConstraints>
389 <RowConstraints minHeight="10.0" vgrow="SOMETIMES"/>
390 </rowConstraints>
391 <AnchorPane minWidth="560.0" prefHeight="535.0" prefWidth="696.0">
392 <Button layoutX="657.0" layoutY="641.0" mnemonicParsing="false" onAction="#quit" text="Quit"/>
393 <TextField fx:id="zonedDateTimeField" layoutX="103.0" layoutY="35.0" prefWidth="126.0" text="yyyy-mm-dd, hh:mm"/>
394 <Button layoutX="14.0" layoutY="35.0" mnemonicParsing="false" onAction="#showErrorDateFormatBox" text="Add Event"/>
395 <ListView fx:id="listView" layoutX="14.0" layoutY="66.0" prefHeight="246.0" prefWidth="686.0">
396 <contextMenu>
397 <ContextMenu fx:id="contextMenuOfListView">
398 <items>
399 <MenuItem mnemonicParsing="false" onAction="#deleteEventByIdFromListView" text="Delete event" fx:id="deleteMenuItem"/>
400 </items>
401 </ContextMenu>
402 </contextMenu>
403 </ListView>
404 <TextField id="textField" fx:id="descriptionField" layoutX="237.0" layoutY="35.0" prefWidth="463.0"
405 text="Description"/>
406 <MenuBar layoutX="0.0" layoutY="2.0" prefWidth="714.0" useSystemMenuBar="false">
407 <Menu mnemonicParsing="false" text="File">
408 <MenuItem mnemonicParsing="false" onAction="#quit" text="Close" />
409 </Menu>
410 <Menu mnemonicParsing="false" text="Edit">
411 <MenuItem mnemonicParsing="false" onAction="#deleteAllEventsFromListView" text="Delete all events" />
412 </Menu>
413 <Menu mnemonicParsing="false" text="Help">
414 <MenuItem mnemonicParsing="false" onAction="#showAboutBox" text="About" />
415 </Menu>
416 </MenuBar>
417 <Button layoutX="14.0" layoutY="324.0" mnemonicParsing="false" onAction="#loadEvents" text="LoadEvents"/>
418 <BorderPane fx:id="borderPane" layoutX="14.0" layoutY="368.0" prefHeight="200.0" prefWidth="686.0"/>
419 </AnchorPane>
420</GridPane>