diff --git a/src/main/java/de/uniluebeck/mi/projmi6/Main.java b/src/main/java/de/uniluebeck/mi/projmi6/Main.java index 696d90b..7f6a99d 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/Main.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/Main.java @@ -57,7 +57,10 @@ public class Main extends Application { Stage loadingMessage = createLoadWindow(); - + loadMainWindowTask.setOnFailed(event -> { + loadMainWindowTask.getException().printStackTrace(); + loadingMessage.close(); + }); loadMainWindowTask.setOnSucceeded(event -> { Parent root = loadMainWindowTask.getValue(); diff --git a/src/main/java/de/uniluebeck/mi/projmi6/view/DateTimePicker.java b/src/main/java/de/uniluebeck/mi/projmi6/view/DateTimePicker.java new file mode 100644 index 0000000..60cf514 --- /dev/null +++ b/src/main/java/de/uniluebeck/mi/projmi6/view/DateTimePicker.java @@ -0,0 +1,168 @@ +package de.uniluebeck.mi.projmi6.view; + +import javafx.beans.binding.Bindings; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.IntegerPropertyBase; +import javafx.collections.FXCollections; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.effect.DropShadow; +import javafx.scene.effect.Effect; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Arrays; +import java.util.stream.IntStream; +import java.time.LocalDateTime; +/** + * A picker for date and time, composed from a DatePicker and two ComboBoxes. It also has an optional Button to set + * date and time to the current system time. + * + * @author Johannes Oehm + */ +public class DateTimePicker extends HBox { + private DatePicker datePicker = new DatePicker(); + //private ComboBox hourPicker = new ComboBox<>(); + // private ComboBox minutePicker = new ComboBox<>(); + private NumberTextField hourText = new NumberTextField(); + private NumberTextField minuteText = new NumberTextField(); + private Button btnNow = new Button("Jetzt"); + + private Effect invalidValue = new DropShadow(10, Color.RED); + + + /** + * Empty constructor for the FXMLLoader. + */ + public DateTimePicker(){ + this.setAlignment(Pos.CENTER); + hourText.setOnKeyReleased(event ->{ + if(hourText.getCaretPosition()>=2){ + int hour = Integer.parseInt(hourText.getText()); + if(hour>=0 && hour <= 24){ + minuteText.requestFocus(); + } + } + }); + hourText.setAlignment(Pos.CENTER_RIGHT); + hourText.setBackground(null); + hourText.setPadding(Insets.EMPTY); + hourText.setPromptText("HH"); + HBox.setHgrow(hourText, Priority.ALWAYS); + minuteText.setBackground(null); + minuteText.setPadding(Insets.EMPTY); + minuteText.setPromptText("MM"); + HBox.setHgrow(minuteText, Priority.ALWAYS); + + hourText.effectProperty().bind(Bindings.createObjectBinding(()->{ + String text = hourText.getText(); + if(text.isEmpty()){ + return null; + } + + int value = Integer.parseInt(text); + if(value>=0&&value<24){ + return null; + } + return invalidValue; + }, hourText.textProperty())); + + minuteText.effectProperty().bind(Bindings.createObjectBinding(()->{ + String text = minuteText.getText(); + if(text.isEmpty()){ + return null; + } + + int value = Integer.parseInt(text); + if(value>=0&&value<59){ + return null; + } + return invalidValue; + }, minuteText.textProperty())); + Label colon = new Label(":"); + + HBox timePicker = new HBox(hourText, colon,minuteText); + timePicker.maxHeightProperty().bind(datePicker.heightProperty()); + timePicker.setMaxWidth(140); + timePicker.getStyleClass().add("button"); + + //Set Now-Button action + btnNow.setOnAction(event -> setToCurrentDateTime()); + + + //Add the subcomponents to the view. + this.getChildren().addAll(datePicker,timePicker,btnNow); + } + + + + + /** + * Setter for the DateTime that is set in the view. + * @param localDateTime The date to be set in the view. + */ + public void setDateTime(LocalDateTime localDateTime){ + hourText.setText(Integer.toString(localDateTime.getHour())); + minuteText.setText(Integer.toString(localDateTime.getMinute())); + datePicker.setValue(LocalDate.from(localDateTime)); + } + + /** + * Sets the date set in the view to the current systems time. + */ + public void setToCurrentDateTime(){ + setDateTime(LocalDateTime.now()); + } + + + /** + * Getter for date and time that is currently set in the view. + * @return A LocalDateTime object or null, if one or more fields are not set. + */ + public LocalDateTime getDateTime(){ + if(datePicker.getValue()==null ){ + return null; + } + try{ + int hour = Integer.parseInt( hourText.getText()); + int minute = Integer.parseInt(minuteText.getText()); + if(hour>=24|| hour<0||minute<0||minute>=60){ + return null; + } + return LocalDateTime.of(datePicker.getValue(), LocalTime.of(hour, minute)); + }catch (Exception e){ + return null; + } + } + + /** + * A property for hiding the "Set date and time to now"-Button. + * @return A BooleanProperty, true if the button is visible. + */ + public BooleanProperty nowButtonVisiblePropety(){ + return btnNow.visibleProperty(); + } + + /** + * Setter for the {@link DateTimePicker#nowButtonVisiblePropety}. + * @param visible When set to true, the button will be shown. + */ + public void setNowButtonVisible(boolean visible){ + btnNow.setVisible(visible); + } + + /** + * Getter for the {@link DateTimePicker#nowButtonVisiblePropety}. + * @return true if the now-Button is visible, false otherwise. + */ + public boolean isNowButtonVisible(){ + return btnNow.isVisible(); + } + + +} diff --git a/src/main/java/de/uniluebeck/mi/projmi6/view/NumberTextField.java b/src/main/java/de/uniluebeck/mi/projmi6/view/NumberTextField.java new file mode 100644 index 0000000..2e73752 --- /dev/null +++ b/src/main/java/de/uniluebeck/mi/projmi6/view/NumberTextField.java @@ -0,0 +1,34 @@ +package de.uniluebeck.mi.projmi6.view; + + +import javafx.scene.control.TextField; + +/** + * based on http://blog.axxg.de/javafx-textfield-beschraenken/ + * + * TextField that only allows two numbers. + * + * Created by Johannes on 14/11/2015. + */ +public class NumberTextField extends TextField { + + + + @Override + public void replaceText(int start, int end, String text) { + int charactersRemoved = end -start; + int charactersAdded = text.length(); + if ((text.matches("[0-9]")||text.length()==0) && getText().length()-charactersRemoved+charactersAdded <=2) { + super.replaceText(start, end, text); + } + } + + @Override + public void replaceSelection(String text) { + int newTextLength = getText().length()-getSelectedText().length()+text.length(); + if (newTextLength<=2 && (text.matches("[0-9]")||text.length()==0)) { + super.replaceSelection(text); + } + } + +} diff --git a/src/main/resources/stationshistorie.fxml b/src/main/resources/stationshistorie.fxml index 49bee14..8ad4d80 100644 --- a/src/main/resources/stationshistorie.fxml +++ b/src/main/resources/stationshistorie.fxml @@ -2,12 +2,14 @@ + + - @@ -44,13 +46,14 @@ + + + diff --git a/src/main/resources/style.css b/src/main/resources/style.css new file mode 100644 index 0000000..e69de29