From 278fe7bc99c2759e3990f4965673145cc45d18f2 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Fri, 4 Mar 2022 11:26:20 +0100 Subject: [PATCH] Updated css stylesheet and converted date from numbers to date format --- ...ven__org_controlsfx_controlsfx_8_40_14.xml | 13 ------- .../Maven__org_jfxtras_jmetro_8_6_9.xml | 13 ------- Bachelor_application.iml | 2 - src/main/java/com/application/DB/DB.java | 30 ++++++++++++--- src/main/java/com/application/Main.java | 35 ++++++++++++------ .../resources/com.application/styleSheet.css | 13 +++++++ target/classes/com.application/styleSheet.css | 13 +++++++ target/classes/com/application/DB/DB.class | Bin 5459 -> 5822 bytes target/classes/com/application/DB/Sort.class | Bin 275 -> 0 bytes target/classes/com/application/Main.class | Bin 7185 -> 7336 bytes 10 files changed, 74 insertions(+), 45 deletions(-) delete mode 100644 .idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml delete mode 100644 .idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml delete mode 100644 target/classes/com/application/DB/Sort.class diff --git a/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml b/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml deleted file mode 100644 index 6958924..0000000 --- a/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml +++ /dev/null @@ -1,13 +0,0 @@ -<component name="libraryTable"> - <library name="Maven: org.controlsfx:controlsfx:8.40.14"> - <CLASSES> - <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14.jar!/" /> - </CLASSES> - <JAVADOC> - <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14-javadoc.jar!/" /> - </JAVADOC> - <SOURCES> - <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14-sources.jar!/" /> - </SOURCES> - </library> -</component> \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml b/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml deleted file mode 100644 index aafb072..0000000 --- a/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml +++ /dev/null @@ -1,13 +0,0 @@ -<component name="libraryTable"> - <library name="Maven: org.jfxtras:jmetro:8.6.9"> - <CLASSES> - <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9.jar!/" /> - </CLASSES> - <JAVADOC> - <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9-javadoc.jar!/" /> - </JAVADOC> - <SOURCES> - <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9-sources.jar!/" /> - </SOURCES> - </library> -</component> \ No newline at end of file diff --git a/Bachelor_application.iml b/Bachelor_application.iml index 989e66d..bcd84db 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -52,7 +52,5 @@ <orderEntry type="library" name="Maven: com.google.cloud:google-cloud-storage:2.4.0" level="project" /> <orderEntry type="library" name="Maven: com.google.apis:google-api-services-storage:v1-rev20211201-1.32.1" level="project" /> <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" /> - <orderEntry type="library" name="Maven: org.jfxtras:jmetro:8.6.9" level="project" /> - <orderEntry type="library" scope="RUNTIME" name="Maven: org.controlsfx:controlsfx:8.40.14" level="project" /> </component> </module> \ No newline at end of file diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index b674e53..b46727f 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -10,9 +10,17 @@ import com.google.cloud.bigquery.JobInfo; import com.google.cloud.bigquery.QueryJobConfiguration; import com.google.cloud.bigquery.TableResult; import com.sun.media.jfxmedia.AudioClip; +import org.apache.commons.codec.binary.Hex; import java.io.File; import java.io.FileInputStream; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.TimeZone; public class DB { @@ -42,12 +50,15 @@ public class DB { public static void getFromExistingTable() throws Exception { + //ArrayList<String, Integer> results = new ArrayList<>(); // Step 2: Prepare query job // A "QueryJob" is a type of job that executes SQL queries // we create a new job configuration from our SQL query and - final String GET_WORD_COUNT = "SELECT VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE treeSpecies LIKE AND TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp"; - + final String GET_WORD_COUNT = "SELECT InTidTork, UtTidTork " + + "FROM sf-drying-optimization.124.int_gs_ds_sipalpackages " + + "WHERE Tork LIKE \"%5%\" AND InTidTork BETWEEN \"2020-05-14 12:51:03\" " + + "AND \"2022-03-03 16:10:09\" ORDER BY InTidTork"; QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(GET_WORD_COUNT).build(); @@ -70,14 +81,21 @@ public class DB { // Step 4: Display results // Print out a header line, and iterate through the // query results to print each result in a new line - System.out.println("Timestamp\tVarient value"); + System.out.println("InTidTork \t UtTidTork"); TableResult result = queryJob.getQueryResults(); for (FieldValueList row : result.iterateAll()) { // We can use the `get` method along with the column // name to get the corresponding row entry - int variantValue = row.get("VariantValue").getNumericValue().intValue(); - String timeStamp = row.get("TimeStamp").getStringValue(); - System.out.printf("%s\t%d\n", timeStamp, variantValue); + + SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + newFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + long inTidTork = row.get("InTidTork").getTimestampValue()/1000; + long utTidTork = row.get("UtTidTork").getTimestampValue()/1000; + + String formatedInTidTork = newFormat.format(inTidTork); + String formatedUtTidTork = newFormat.format(utTidTork); + System.out.printf("%s\t\t\t\t\t%s\n", formatedInTidTork, formatedUtTidTork); + } } } \ No newline at end of file diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index e04a12c..cceaf4d 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,9 +1,11 @@ package com.application; +import com.application.DB.DB; import javafx.application.Application; import javafx.scene.chart.LineChart; +import javafx.scene.control.MenuBar; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.image.Image; @@ -37,6 +39,7 @@ public class Main extends Application { private HBox logoBar; private VBox sideBar; private LineChart lineChart; + private MenuBar menubar2; /** * Starts the application @@ -61,6 +64,7 @@ public class Main extends Application { this.menuBar = new HBox(); this.logoBar = new HBox(); this.sideBar = new VBox(); + this.menubar2 = new MenuBar(); } /** @@ -77,26 +81,30 @@ public class Main extends Application { this.logoBar = createLogoBar(); this.lineChart = createLineChart(); + //Set id's to connect to css stylesheet + root.setId("root"); + this.logoBar.setId("logoBar"); + this.menuBar.setId("menuBar"); + this.sideBar.setId("sideBar"); + this.lineChart.setId("lineChart"); + // Sets alignment for the topBar this.topBar.setTop(menuBar); this.topBar.setCenter(logoBar); - this.sideBar.setMinWidth(300); - - //Set id for panes - root.setId("root"); - this.menuBar.setId("menuBar"); - // Sets alignment for the panes to the parent root root.setTop(this.topBar); root.setLeft(this.sideBar); root.setCenter(this.lineChart); + VBox.setVgrow(this.logoBar, Priority.ALWAYS); + + DB.getFromExistingTable(); // Sets the scene and defines boundaries //Scene scene = new Scene(root, 1200, 600); Scene scene = new Scene(root, 1200, 600); - scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/com.application/styleSheet.css")).toExternalForm()); + scene.getStylesheets().add(getClass().getResource("/com.application/styleSheet.css").toExternalForm()); primaryStage.setTitle("Moelven Drying Application"); //primaryStage.setMaximized(true); @@ -148,22 +156,27 @@ public class Main extends Application { } - + /** + * This function imports the logos and defines the alignments + * @return a logoBar containing the logos in proper alignments + * @throws FileNotFoundException + */ private HBox createLogoBar() throws FileNotFoundException { - //Creating an image + // Defining the image paths Image moelvenLogoM = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_m.jpg")); Image moelvenLogoTitle = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_title.jpg")); - //Setting the image view + // Creating imageview objects ImageView imageViewM = new ImageView(moelvenLogoM); ImageView imageViewTitle = new ImageView(moelvenLogoTitle); + // Defining resolution and aspect ratio imageViewM.setFitHeight(100); imageViewM.setPreserveRatio(true); - imageViewTitle.setFitHeight(100); imageViewTitle.setPreserveRatio(true); + // Defining alignments Region region1 = new Region(); HBox.setHgrow(region1, Priority.ALWAYS); diff --git a/src/main/resources/com.application/styleSheet.css b/src/main/resources/com.application/styleSheet.css index 1efb3b4..f2f7ab0 100644 --- a/src/main/resources/com.application/styleSheet.css +++ b/src/main/resources/com.application/styleSheet.css @@ -9,4 +9,17 @@ -fx-font-size: 14; } +#logoBar { + -fx-pref-height: 100; + -fx-max-width: infinity; + -fx-background-color: rgba(12, 76, 81, 1); + -fx-alignment: center; +} + +#sideBar { + -fx-pref-width: 300; +} + + + diff --git a/target/classes/com.application/styleSheet.css b/target/classes/com.application/styleSheet.css index 1efb3b4..f2f7ab0 100644 --- a/target/classes/com.application/styleSheet.css +++ b/target/classes/com.application/styleSheet.css @@ -9,4 +9,17 @@ -fx-font-size: 14; } +#logoBar { + -fx-pref-height: 100; + -fx-max-width: infinity; + -fx-background-color: rgba(12, 76, 81, 1); + -fx-alignment: center; +} + +#sideBar { + -fx-pref-width: 300; +} + + + diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index c77ffce8fa0cbecece9c222fcf0d44db5e517a4b..54d5fed9c7c08e1745ce5b53aa191eb9caf3b723 100644 GIT binary patch delta 2126 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 delta 1795 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 OLn(tKLkmL_hz|e=@RNK1 diff --git a/target/classes/com/application/DB/Sort.class b/target/classes/com/application/DB/Sort.class deleted file mode 100644 index a8073b0698d44e99c2a6ec25c9c9012f4d5568f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmX^0Z`VEs1_l!b0WJn+23~dsK6VCvMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mg}3D{N%)(u*9NF5FaYYQj(Eb%*Y_=lboNcpIA_klbM`Yl9`{U z@8YB%oL^L8&B(wNoL^d$oa&YdGK3Q(sF#&kmdL}v!obSNAdW*LBZB})m3~fQUb?=2 zQdVkm34<a769Y2?2rx1*g0wR*GO#f)Fz7RY_zVoJTH6^IH!?6VFfp(*Ffgz&FfuSO bFf(v4Ffj0d*{lql3|tHh42%riU{yQ-36wag diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 6df8d5af623e4d83379853b325596f2de5b2fa48..7f5dd8be87f89da0ee1c433c2fab6350574ae043 100644 GIT binary patch delta 3337 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 delta 3245 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 NU|?qW$nc5bGXT*7phy4! -- GitLab