From 1660f80c6fe9a61784c4a6202bd47eb7dc5ff636 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Thu, 10 Mar 2022 12:33:02 +0100 Subject: [PATCH] Redesigned the menubar and added labels and textfields to the sidebar --- src/main/java/com/application/DB/DB.java | 8 +- src/main/java/com/application/Main.java | 114 +++++++++++------- .../resources/com.application/styleSheet.css | 21 +++- target/classes/com.application/styleSheet.css | 21 +++- target/classes/com/application/DB/DB.class | Bin 9070 -> 8126 bytes target/classes/com/application/Main.class | Bin 7710 -> 7698 bytes 6 files changed, 117 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index 9c4cbfa..af9ca51 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -114,7 +114,7 @@ public class DB { final String sqlStatement = "SELECT TimeStamp, VariantValue " + "FROM sf-drying-optimization.124.int_sd_winccsensordata " + "WHERE TimeStamp BETWEEN \"2021-01-25 08:51:03\" " + - "AND \"2021-03-08 11:10:09\" ORDER BY TimeStamp ASC"; + "AND \"2021-02-08 11:10:09\" ORDER BY TimeStamp ASC"; // Creates a job configuration queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build()); @@ -140,7 +140,7 @@ public class DB { data.put(formatedTimeStamp, variantValue); } - +/* NavigableMap<String, Number> sortedData = new TreeMap<>(data); for (Map.Entry<String, Number> entry : sortedData.entrySet()) { @@ -151,6 +151,8 @@ public class DB { System.out.println("Neste: "+next); } + */ + return data; } @@ -197,7 +199,7 @@ public class DB { String formattedCalculatedStop = dateFormat.format(calculatedStop); java.sql.Timestamp timestamp = new Timestamp(calculatedStart); - System.out.println(timestamp); + //System.out.println(timestamp); //System.out.printf("%s\t\t\t%s\t\t\t%s\n",name, formattedCalculatedStart, formattedCalculatedStop); diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index a21f7f2..f00bba9 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -3,10 +3,9 @@ package com.application; import com.application.DB.DB; import javafx.application.Application; +import javafx.geometry.Pos; import javafx.scene.chart.LineChart; -import javafx.scene.control.MenuBar; -import javafx.scene.control.ToggleButton; -import javafx.scene.control.ToggleGroup; +import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.*; @@ -30,11 +29,10 @@ import java.util.*; public class Main extends Application { private BorderPane topBar; - private HBox menuBar; private HBox logoBar; private VBox sideBar; private LineChart<String, Number> lineChart; - private MenuBar menubar2; + private MenuBar menuBar; /** * Starts the application @@ -56,10 +54,9 @@ public class Main extends Application { // Initializing variables this.topBar = new BorderPane(); - this.menuBar = new HBox(); this.logoBar = new HBox(); this.sideBar = new VBox(); - this.menubar2 = new MenuBar(); + this.menuBar = new MenuBar(); } /** @@ -74,6 +71,7 @@ public class Main extends Application { // Create panes for root BorderPane root = new BorderPane(); this.menuBar = createMenuBar(); + this.sideBar = createSideBar(); this.logoBar = createLogoBar(); this.lineChart = createLineChart(); @@ -84,8 +82,11 @@ public class Main extends Application { this.sideBar.setId("sideBar"); this.lineChart.setId("lineChart"); + // Sett the menubar in a vbox inorder to stretch over the whole screen + VBox vBox = new VBox(this.menuBar); + // Sets alignment for the topBar - this.topBar.setTop(menuBar); + this.topBar.setTop(vBox); this.topBar.setCenter(logoBar); // Sets alignment for the panes to the parent root @@ -95,8 +96,8 @@ public class Main extends Application { VBox.setVgrow(this.logoBar, Priority.ALWAYS); - DB.getName(); - System.out.println(DB.getKwh()); + //DB.getName(); + //System.out.println(DB.getKwh()); // Sets the scene and defines boundaries //Scene scene = new Scene(root, 1200, 600); @@ -117,42 +118,71 @@ public class Main extends Application { * * @return MenuBar as a HBox */ - private HBox createMenuBar() { - // Creating buttons for menubar - ToggleGroup btnMenuGroup = new ToggleGroup(); - ToggleButton btnMenuHome = new ToggleButton("Home"); - ToggleButton btnMenuInput = new ToggleButton("Input"); - ToggleButton btnMenuFinish = new ToggleButton("Finish"); - ToggleButton btnMenuHelp = new ToggleButton("Help"); - - - // Set the buttons toggleable - btnMenuHome.setToggleGroup(btnMenuGroup); - btnMenuInput.setToggleGroup(btnMenuGroup); - btnMenuFinish.setToggleGroup(btnMenuGroup); - btnMenuHelp.setToggleGroup(btnMenuGroup); - - // Set the home button as default selected - btnMenuHome.setSelected(true); - - //Make sure always one button is selected - btnMenuGroup.selectedToggleProperty().addListener((obsVal, oldVal, newVal) -> { - if (newVal == null) - oldVal.setSelected(true); - }); - - /* - btnMenuMetaImage.setOnAction(e -> featurePane.loadMetaImage()); - btnMenuImport.setOnAction(e -> featurePane.loadImport()); - btnMenuCreate.setOnAction(e -> featurePane.loadCreate()); - btnMenuSearch.setOnAction(e -> featurePane.loadSearch()); - */ - - menuBar.getChildren().addAll(btnMenuHome, btnMenuInput, btnMenuFinish, btnMenuHelp); + private MenuBar createMenuBar() { + + // Creating a menubar + MenuBar menuBar = new MenuBar(); + + // Defining the individual menus + Menu menuFile = new Menu("File"); + Menu menuEdit = new Menu("Edit"); + Menu menuHelp = new Menu("Help"); + + // Adding the menus to the menubar + menuBar.getMenus().add(menuFile); + menuBar.getMenus().add(menuEdit); + menuBar.getMenus().add(menuHelp); + + // Returns the menubar return menuBar; } + + private VBox createSideBar(){ + + // Creating a vbox + VBox sideBarVBox = new VBox(); + //sideBarVBox.prefHeight(500); + + Label treeSpeciesLabel = new Label("Tree Species"); + treeSpeciesLabel.setId("sideBarLabelText"); + TextField treeSpeciesText = new TextField(); + treeSpeciesText.setId("sideBarLabelText"); + treeSpeciesText.setPromptText("Bjørk"); + + Label dimensionsLabel = new Label("Width x Height"); + dimensionsLabel.setId("sideBarLabelText"); + TextField dimensionsText = new TextField(); + dimensionsText.setId("sideBarLabelText"); + dimensionsText.setPromptText("47 x 150"); + + Label sawsetLabel = new Label("Sawset"); + sawsetLabel.setId("sideBarLabelText"); + TextField sawsetText = new TextField(); + sawsetText.setId("sideBarLabelText"); + sawsetText.setPromptText("4x"); + + Label moistureGoalLabel = new Label("Moisture Goal"); + moistureGoalLabel.setId("sideBarLabelText"); + TextField moistureGoalText = new TextField(); + moistureGoalText.setId("sideBarLabelText"); + moistureGoalText.setPromptText("12%"); + + Button finish = new Button("Finish"); + finish.setTranslateX(5); + + sideBarVBox.getChildren().addAll(treeSpeciesLabel, treeSpeciesText, dimensionsLabel, dimensionsText, sawsetLabel, sawsetText, moistureGoalLabel, moistureGoalText, finish); + + VBox.setVgrow(sideBarVBox, Priority.ALWAYS); + + return sideBarVBox; + + + + } + + /** * This function imports the logos and defines the alignments * diff --git a/src/main/resources/com.application/styleSheet.css b/src/main/resources/com.application/styleSheet.css index f2f7ab0..5839eb7 100644 --- a/src/main/resources/com.application/styleSheet.css +++ b/src/main/resources/com.application/styleSheet.css @@ -17,7 +17,26 @@ } #sideBar { - -fx-pref-width: 300; + -fx-pref-width: 250; +} + +#sideBarLabel { + -fx-pref-height: 17; + -fx-translate-x: 10; + -fx-max-height: infinity; + -fx-max-width: infinity; + /*-fx-alignment: center;*/ + -fx-font-family: Arial; +} + +#sideBarLabelText { + -fx-pref-height: 17; + -fx-translate-x: 5; + -fx-max-height: infinity; + -fx-max-width: infinity; + -fx-font-family: Arial; + /*-fx-alignment: center;*/ + -fx-font-style: normal; } diff --git a/target/classes/com.application/styleSheet.css b/target/classes/com.application/styleSheet.css index f2f7ab0..5839eb7 100644 --- a/target/classes/com.application/styleSheet.css +++ b/target/classes/com.application/styleSheet.css @@ -17,7 +17,26 @@ } #sideBar { - -fx-pref-width: 300; + -fx-pref-width: 250; +} + +#sideBarLabel { + -fx-pref-height: 17; + -fx-translate-x: 10; + -fx-max-height: infinity; + -fx-max-width: infinity; + /*-fx-alignment: center;*/ + -fx-font-family: Arial; +} + +#sideBarLabelText { + -fx-pref-height: 17; + -fx-translate-x: 5; + -fx-max-height: infinity; + -fx-max-width: infinity; + -fx-font-family: Arial; + /*-fx-alignment: center;*/ + -fx-font-style: normal; } diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index 09e5c74d9286c746e9a1a46b2c1ffd7dcea1c4c9..ae3a9ac70f511fc26df8fe9fa898fc8061277dfd 100644 GIT binary patch delta 2139 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 X=?oiKI2m>^>;Tgj8O}3oV2}g=4u+(O delta 3053 zcmdmI|IV%c)W2Q(7#J8#80T;?Br@z~XV}BRu$PO0iD4f*!+tIXR)zyy3<ntwfmnyx z8IEu<a55a_Vn|>(#>H@);RJ|vl8b?#;S@W=X%2?7Am%v`aULXnft}$ZNW~>ChRY0B zxEQW7Tw`ar&dnggaFd<k78k>9hCB7_40kyg?r|~5Fzf>f+~;C=!0?cZ;Ss}Qc7`Wh z3`z{UIT)UDF+5{<&d%_Hi$RTH9|yxrE{0bOueliBFuVmB|BjO(f#E$n!v~N7pEwyl zGkoD-_{zobjo~{N!w-g^+zh`MeseSYVfYIo{;@Os=U`;uVlZQ5<YKI6Vr1rGWMO3G zU}WQBWMX7zWdH-_7hH@SjGSDIT#VdYj696IAcBvJk)Kh3n^BNah@DZGi@}vqgqu;6 zQH+~WoZ&Y+qXajDC!-`gqZCL`nw?RGi@}#+HwU9E7lSXO9EkIngHfJ?QGtU|k&97@ zQJIU8OOsKBgHe@(QH_I99b~@-2csqjqZT`(HWx!IqYf9tH%47{Mm=^${mto&vlzMd zurnI4Gwf$)II@|WS%Q(#aIy-^IY;K~)JjGMmb}!85=I8r)Vz|SN=61&R|w7HnU|MZ z<eZaOT%20W$RO&Il~|UjUs{rxqwkwopaNDk`8~_>Fs|bKqLS1Um&B4pMg|EaWqyfe zndym1IjO#h1=frVVm|rFi8*13MVTP6kjjG85D<fr!5T>q!svah>XX;9T8J|;*dfWo z&78cORY%x}oza+`(S)5*ik;DvozaY)(R}iE){QEhC7HRY#U+Wk1&j<L5Z%RvIr<?m zQENs9pUE3or6wO2=be0k&5k*ZA$_tSd!l|CqXi>_IM}C|`TA~|IjNp`1*IjyB}J); zxjYPMjF#+-Ry>T>j5a)swhZZ$7qUyp+A-SmFtjnWvokvIFgh|i@i62v<nb^%GrBS| z7*1X&AT{{|yYgfu4oLwwMt2@Y4@OTOMlVKhMg}FQB!>hKLp?(SJEIRszb`wZA4ruy zBZCf1!Q|x}5^MpCfs70?lNp6%IM^8tc^HEjgD1b_&=(G23}t5w<6#VEj9_Ps<YA0r zjGnB`sl#T>!x+ODJ2{qfJ)`ktUM@B1IFRx2?2HK@;}dxp8X1~+7?K#085vCB78P)5 zc_%R@voogfFs3r5F*1mH=7nUYgya`xD{v}=mO$C;jOjd#8H^U}jHWz{nT%QNjM+Sl zIgGjNjAlHHd5rly3{w~j7#TFc=KklBuP<aQVrMMoVJu-RWoInoVJv5?U}WF~MMy9x zns^v18LQYCt9ck}7;D)XO?Vh)GuE*)*7GnnFgEfqHZeA{Gq!*vTiF?nco^Fl+Zh=I z!O;XxkRe5>phO0WpbmCMa~{S{#x8coZbk-SsG2C`RLjHI19F@ISS}|qFI_*lq$o2l zorkfPu@4sgNa9YVnK>z`MT`ureutM@Dey4%GfrS+VE0QcE=jdgn4Hfo$32mUaT4QX z9>yt*Q#a4xc4K6o#uz>MA&(VD8sl_OK+Tve$9sfP6&xG_d`jYCV7tL?ho@-Y#DdKR zeEE!wvo<f_|G>&5qA~e_xaj6}q8>~!8jwT`)&R;)nqiC#9N-KaoLa)jAgG~<q#!u8 z#F~+T7hwfh4O@C@i8m;}b7y3xXQUQ^GcY5ArpDxR;*!!ZlOg%qnvsDmv7jI|FNKjo zce0+aln`ccO#UR^FUQCr3UwM-fqzm~YI2FSW*9r;Y(@t4$r~l)CohxGO-Nu!WME)m zV&DQLHwFd<E`}6_R0akHb_Pa<G=_8rMurRq1_pfwMg~R(1_oBG?F@_?!5T6d7#P^V zf)Wf_3=9lBU^Xj5HbV~Bm|TWD1}27#$;Ofk88atel~k?=snTL#VUS`_WXNYIU|?hr zW(Z~|WGDh#AIDJ4P{P2#kjB6Sl`UmpV2EJg_|Krpz{1W@#?DaA&QQV5P|3i^&QQtq zpMec5%zz~5&dyNzpFx0ujh&$kCJxt7&-|Z(iGc}X5(5K66$1kU3j-sA3<D=aHA4-^ zu?!3h#xS4mVBii%_!LxsGB6l2urL^*__mgz4#g-gP;mh@%8h{uT=U57VBp!oz&rVy zl&n4|)WjG-Rgwb(GlL@oAA=Kv2!k_&EQ14*gSbEi0LYZdPSR0~nUm*AD|>-LPYi6L zCqpws3j+g#2!km&(ij;)A;rnS^oK#4ouO44$skTp>BqnfibJNE3@i-13=E8>leuJ8 z)$e9-jnvxC;AX`t$-0xlosnTDg9jsn6`Lg6P6iW3hM5dmAeJd3!vO|QD|SitoeW+e zwzn0BBrBA+lfj3H0WQwDi9vrigKy+^20tPHZ43dD9NQQIwlM^5V=zRL2?EJ*Zex&u zN-h6CNoxZ*B0wP%#~?oWkc@r(1cogPlNfF=OlEk(Food{!!$-QhUtt33^N#w8D@jS ze+C0TLmq=ALkB}A13N<<gC;{4LpK8lLnnhALk~kQ0~f<Y1~G;{hJFTahM5d}3=<go z8F(1t89W#!GE8D%V|c>g!!Vhlmw|)f4}%HA6oy^~PKFx{5e!oqW-zeVGjK5KGR$O{ z#lXP8$EeOQn_&(EBZCB^EJF&zTm~ivX+|lAc?`V_%nYWC3=H!b7BH|dY+-0*Sje!5 zft6t~0|SEs12fdPB@FCP)0Q$YKvgYcU<F5+76Z$F22W6GUCz$1f}LR{JHsk=hSlu# z3~Lw|elaBcWe{g)Sj*0^<`+W&Qlzc}=fCv~oD3Tn(m|<&fq`)s0}BHm0|Ud(-3&^R z+ZmL-cQdF(3I%UxQ1{Um3faLBx{V=BDBM>ld<TQ(HU_O74BDF+bT%>QFz;p1-NvBj zw~0YtC}JCfq3$*Yqn$Pk#*7SBERrnHq>v6`fs=w6D7gqlZey_6#t>!2Cdn!k4QAVj zFxcjrvrDoH#Y_&9Q>l-Q6l34c5NE}^i9uhIcN;_e^8ZsonTdq~6wPi7f(#4{%NaNr zRx=1OtYMI5*vKHqu$@7NVHblr!)^w9hCK`k4Eq^!7!ESjFdSm&VK~Ato#80MB8KA( zYZ*>3Y-KpZu!G?oI3W};a5LmEcrt8c=w)DIs9~^V*u>CX&%n;m!=TBqnW3A3lVLi8 z9K#ldUIuQ4MGV3WTN!#8co^0)a4>9R*v`PqkiZZMP7|yQ91I(wkuJor930h*3~~&! z!BNe`V9wA4j%sFb1cORDi25B24B*I=W?=fy;Kjho&aj+41s;`<n9N0rJy4bb6}Y<? zrZX@wSTV3OcrpqyOk?9@;Ac3_aE5`CL4rYq;RXXIgD!&z!$$^AMi<7J3};w48Ll#1 O2GegCUNM|ukOTmAMW2TN diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 2aba5bd4c21111477289f6aa05bc62773886010e..324b19675b65197d4779a15ad0a53250c89a9c3d 100644 GIT binary patch delta 4030 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 delta 4048 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 -- GitLab