Commit f15a5890729eeb12d748b54d5809fc69dbd30a2c

Authored by lsagona
1 parent 513c0341c5
Exists in master and in 1 other branch dev

add better chart

Showing 6 changed files with 173 additions and 119 deletions Side-by-side Diff

build.gradle View file @ f15a589
... ... @@ -8,6 +8,9 @@
8 8  
9 9 repositories {
10 10 mavenCentral()
  11 + maven {
  12 + url "https://jitpack.io"
  13 + }
11 14 }
12 15  
13 16 dependencies {
... ... @@ -17,6 +20,7 @@
17 20 testCompile group: 'junit', name: 'junit', version: '4.12'
18 21 testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
19 22 compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
  23 + compile 'com.github.jasrodis:javafx-dataviewer-wrapper:-SNAPSHOT'
20 24 }
21 25  
22 26 compileKotlin {
src/main/kotlin/application/App.kt View file @ f15a589
1 1 package application
2 2  
3 3 import javafx.application.Application
  4 +import javafx.application.Platform
  5 +import javafx.event.EventHandler
4 6 import javafx.fxml.FXMLLoader
5 7 import javafx.scene.Parent
6 8 import javafx.scene.Scene
7 9 import javafx.stage.Stage
  10 +import javafx.stage.WindowEvent
8 11 import jfxtras.styles.jmetro.JMetro
9 12 import jfxtras.styles.jmetro.Style
  13 +import kotlin.system.exitProcess
10 14  
11 15 class App : Application() {
12 16 var style : Style = Style.LIGHT
13 17  
... ... @@ -19,7 +23,13 @@
19 23 JMetro(scene, style)
20 24 primaryStage!!.scene = scene
21 25 primaryStage.title = "Maritime Visualisation"
  26 + primaryStage.onCloseRequest = EventHandler { closeApplication() }
22 27 primaryStage.show()
  28 + }
  29 +
  30 + private fun closeApplication() {
  31 + Platform.exit()
  32 + exitProcess(0)
23 33 }
24 34  
25 35 companion object {
src/main/kotlin/application/controller/DataPanelController.kt View file @ f15a589
... ... @@ -5,13 +5,17 @@
5 5 import javafx.collections.ObservableList
6 6 import javafx.fxml.FXML
7 7 import javafx.fxml.Initializable
8   -import javafx.scene.chart.CategoryAxis
9   -import javafx.scene.chart.NumberAxis
10   -import javafx.scene.chart.ScatterChart
11   -import javafx.scene.chart.XYChart.Data
12   -import javafx.scene.chart.XYChart.Series
13 8 import javafx.scene.control.ListCell
14 9 import javafx.scene.control.ListView
  10 +import javafx.scene.layout.StackPane
  11 +import org.charts.dataviewer.api.config.DataViewerConfiguration
  12 +import org.charts.dataviewer.api.data.PlotData
  13 +import org.charts.dataviewer.api.trace.LineTrace
  14 +import org.charts.dataviewer.api.trace.ScatterTrace
  15 +import org.charts.dataviewer.javafx.JavaFxDataViewer
  16 +import org.charts.dataviewer.utils.TraceColour
  17 +import org.charts.dataviewer.utils.TraceMode
  18 +import org.charts.dataviewer.utils.TraceVisibility
15 19 import java.net.URL
16 20 import java.util.*
17 21  
18 22  
19 23  
20 24  
21 25  
22 26  
23 27  
... ... @@ -20,36 +24,48 @@
20 24 private var dataList: ObservableList<Pair<String, ArrayList<MessageData?>>> = FXCollections.observableArrayList()
21 25 private lateinit var timeData: ArrayList<MessageData?>
22 26  
  27 +
23 28 @FXML
24 29 var dataListView = ListView<Pair<String, ArrayList<MessageData?>>>()
25 30  
26   - @FXML
27   - var xaxisNumber: CategoryAxis = CategoryAxis()
  31 +// @FXML
  32 +// var stackPanePlot = StackPane()
28 33  
29 34 @FXML
30   - var yaxisNumber: NumberAxis = NumberAxis()
  35 + var dataViewer = JavaFxDataViewer()
31 36  
32   - @FXML
33   - lateinit var scatterChartNumber: ScatterChart<String, Number>
  37 +// @FXML
  38 +// var xaxisNumber: CategoryAxis = CategoryAxis()
  39 +//
  40 +// @FXML
  41 +// var yaxisNumber: NumberAxis = NumberAxis()
  42 +//
  43 +// @FXML
  44 +// lateinit var scatterChartNumber: ScatterChart<String, Number>
  45 +//
  46 +// @FXML
  47 +// var xaxisCategory: CategoryAxis = CategoryAxis()
  48 +//
  49 +// @FXML
  50 +// var yaxisCategory: CategoryAxis = CategoryAxis()
  51 +//
  52 +// @FXML
  53 +// lateinit var scatterChartCategory: ScatterChart<String, String>
34 54  
35   - @FXML
36   - var xaxisCategory: CategoryAxis = CategoryAxis()
37   -
38   - @FXML
39   - var yaxisCategory: CategoryAxis = CategoryAxis()
40   -
41   - @FXML
42   - lateinit var scatterChartCategory: ScatterChart<String, String>
43   -
44 55 override fun initialize(location: URL?, resources: ResourceBundle?) {
45   - xaxisNumber.animated = false
46   - yaxisNumber.animated = false
47   - xaxisCategory.animated = false
48   - yaxisCategory.animated = false
  56 +// xaxisNumber.animated = false
  57 +// yaxisNumber.animated = false
  58 +// xaxisCategory.animated = false
  59 +// yaxisCategory.animated = false
49 60 setObservableSelectedVesselListener()
50 61 dataListView.items = dataList
51 62  
52 63  
  64 + val plotData = PlotData()
  65 + plotData.addTrace(createScatterTrace())
  66 + val config = DataViewerConfiguration()
  67 + config.showLegend(true)
  68 + config.setLegendInsidePlot(false)
53 69  
54 70 dataListView.setCellFactory {
55 71 object : ListCell<Pair<String, ArrayList<MessageData?>>?>() {
56 72  
57 73  
58 74  
59 75  
60 76  
61 77  
62 78  
63 79  
64 80  
65 81  
66 82  
67 83  
... ... @@ -65,61 +81,104 @@
65 81 }
66 82  
67 83 dataListView.selectionModel.selectedItemProperty().addListener { _, _, newValue ->
68   - if (newValue == null){
69   - scatterChartCategory.data.clear()
70   - scatterChartNumber.data.clear()
  84 + if (newValue == null) {
  85 + plotData.allTraces.clear()
  86 + config.setxAxisTitle("")
  87 + config.setyAxisTitle("")
  88 + dataViewer.resetPlot()
  89 +
71 90 return@addListener
72 91 }
73   - val serieNumber = Series<String, Number>()
74   - val serieString = Series<String, String>()
75 92  
76 93 val getValueVisitorX = GetValueVisitor()
77 94 val getValueVisitorY = GetValueVisitor()
78 95  
  96 + val arrayListStringX = arrayListOf<String>()
  97 + val arrayListDoubleX = arrayListOf<Double>()
  98 + val arrayListStringY = arrayListOf<String>()
  99 + val arrayListDoubleY = arrayListOf<Double>()
79 100  
80   - for (x in 0 until newValue?.second?.size!!) {
  101 + for (x in 0 until newValue.second.size) {
81 102 timeData[x]?.accept(getValueVisitorX)
82 103 newValue.second[x]?.accept(getValueVisitorY)
83 104  
84   - if (getValueVisitorY.value.toDoubleOrNull() == null){
85   - serieString.data.add(Data<String, String>(getValueVisitorX.value, getValueVisitorY.value))
86   - } else{
87   - serieNumber.data.add(Data<String, Number>(getValueVisitorX.value, getValueVisitorY.value.toDouble()))
  105 + if (getValueVisitorY.value.toDoubleOrNull() == null) {
  106 + arrayListStringX.add(getValueVisitorX.value)
  107 + arrayListStringY.add(getValueVisitorY.value)
  108 + } else {
  109 + arrayListStringX.add(getValueVisitorX.value)
  110 + arrayListDoubleY.add(getValueVisitorY.value.toDouble())
88 111 }
89   -
90 112 }
91 113  
92   - scatterChartNumber.data.clear()
93   - scatterChartCategory.data.clear()
  114 + val scatterTrace = ScatterTrace<Any>()
  115 + scatterTrace.traceColour = TraceColour.RED
  116 + scatterTrace.traceVisibility = TraceVisibility.TRUE
94 117  
95   - if (getValueVisitorY.value.toDoubleOrNull() == null){
96   - serieString.data.add(Data<String, String>(getValueVisitorX.value, getValueVisitorY.value))
97   - scatterChartCategory.data.addAll(serieString)
98   - setChartCategoryVisible()
99   - xaxisCategory.label = "Date"
100   - yaxisCategory.label = newValue.first
101   - } else{
102   - serieNumber.data.add(Data<String, Number>(getValueVisitorX.value, getValueVisitorY.value.toDouble()))
103   - scatterChartNumber.data.addAll(serieNumber)
104   - setChartNumberVisible()
105   - xaxisNumber.label = "Date"
106   - yaxisNumber.label = newValue.first
  118 + val serieStringX: Array<String> = arrayListStringX.toTypedArray()
  119 +// val serieDoubleX: Array<Double> = arrayListDoubleX.toTypedArray()
  120 + val serieStringY: Array<String> = arrayListStringY.toTypedArray()
  121 + val serieDoubleY: Array<Double> = arrayListDoubleY.toTypedArray()
  122 +
  123 + if (getValueVisitorY.value.toDoubleOrNull() == null) {
  124 + scatterTrace.setxArray(serieStringX)
  125 + scatterTrace.setyArray(serieStringY)
  126 + } else {
  127 + scatterTrace.setxArray(serieStringX)
  128 + scatterTrace.setyArray(serieDoubleY)
107 129 }
108 130  
  131 + config.setxAxisTitle("Date")
  132 + config.setyAxisTitle(newValue.first)
  133 + dataViewer.resetPlot()
  134 + plotData.allTraces.clear()
  135 + plotData.addTrace(scatterTrace)
  136 + dataViewer.updateConfiguration(config)
  137 + dataViewer.updatePlot(plotData)
  138 +
109 139 }
110 140  
  141 + plotData.allTraces.clear()
  142 +// plotData.addTrace(createScatterTrace())
  143 + config.setxAxisTitle("")
  144 + config.setyAxisTitle("")
  145 + config.plotTitle = "No data selected"
  146 + dataViewer.updateConfiguration(config)
  147 + dataViewer.updatePlot(plotData)
  148 +
  149 +// stackPanePlot.children.add(dataViewer)
  150 +
111 151 }
112 152  
113   - private fun setChartCategoryVisible(){
114   - scatterChartCategory.isVisible = true
115   - scatterChartNumber.isVisible = false
  153 + private fun createScatterTrace(): ScatterTrace<*>? {
  154 + val scatterTrace = ScatterTrace<Any>()
  155 + scatterTrace.setxArray(arrayOf("asdf", "fdsa", "asdfffe", "asdfe", "asfee3"))
  156 + scatterTrace.setyArray(arrayOf("pppp", "koojoi", "pp", "ii", "rty", "ert"))
  157 + scatterTrace.traceName = "MyScatterTrace"
  158 + scatterTrace.traceColour = TraceColour.PURPLE
  159 + scatterTrace.traceMode = TraceMode.MARKERS
  160 + return scatterTrace
116 161 }
117 162  
118   - private fun setChartNumberVisible(){
119   - scatterChartCategory.isVisible = false
120   - scatterChartNumber.isVisible = true
  163 + fun createLineTrace(): LineTrace<*>? {
  164 + val lineTrace = LineTrace<Any>()
  165 + lineTrace.setxArray(arrayOf("asdf", "fdsa", "asdfffe", "asdfe", "asfee3"))
  166 + lineTrace.setyArray(arrayOf(0.0, 1.0, 2.0, 3.0, 4.0, 5.0))
  167 + lineTrace.traceName = "MyLineTrace"
  168 + lineTrace.traceColour = TraceColour.PURPLE
  169 + return lineTrace
121 170 }
122 171  
  172 +// private fun setChartCategoryVisible() {
  173 +// scatterChartCategory.isVisible = true
  174 +// scatterChartNumber.isVisible = false
  175 +// }
  176 +//
  177 +// private fun setChartNumberVisible() {
  178 +// scatterChartCategory.isVisible = false
  179 +// scatterChartNumber.isVisible = true
  180 +// }
  181 +
123 182 private fun setObservableSelectedVesselListener() {
124 183 observableSelectedVessel.listeners.add(this)
125 184 }
126 185  
127 186  
128 187  
129 188  
130 189  
131 190  
132 191  
133 192  
... ... @@ -166,63 +225,63 @@
166 225 return allHeading
167 226 }
168 227  
169   - private fun populatVesselName(vessel: Vessel): ArrayList<MessageData?> {
  228 + private fun populateVesselName(vessel: Vessel): ArrayList<MessageData?> {
170 229 val allVesselName: ArrayList<MessageData?> = vessel.getAllVesselName()
171 230 allVesselName.sortBy { (it as VesselName).value }
172 231  
173 232 return allVesselName
174 233 }
175 234  
176   - private fun populatIMO(vessel: Vessel): ArrayList<MessageData?> {
  235 + private fun populateIMO(vessel: Vessel): ArrayList<MessageData?> {
177 236 val allIMO: ArrayList<MessageData?> = vessel.getAllIMO()
178 237 allIMO.sortBy { (it as IMO).value }
179 238  
180 239 return allIMO
181 240 }
182 241  
183   - private fun populatCallSign(vessel: Vessel): ArrayList<MessageData?> {
  242 + private fun populateCallSign(vessel: Vessel): ArrayList<MessageData?> {
184 243 val allCallSign: ArrayList<MessageData?> = vessel.getAllCallSign()
185 244 allCallSign.sortBy { (it as CallSign).value }
186 245  
187 246 return allCallSign
188 247 }
189 248  
190   - private fun populatVesselType(vessel: Vessel): ArrayList<MessageData?> {
  249 + private fun populateVesselType(vessel: Vessel): ArrayList<MessageData?> {
191 250 val allVesselType: ArrayList<MessageData?> = vessel.getAllVesselType()
192 251 allVesselType.sortBy { (it as VesselType).value }
193 252  
194 253 return allVesselType
195 254 }
196 255  
197   - private fun populatStatus(vessel: Vessel): ArrayList<MessageData?> {
  256 + private fun populateStatus(vessel: Vessel): ArrayList<MessageData?> {
198 257 val allStatus: ArrayList<MessageData?> = vessel.getAllStatus()
199 258 allStatus.sortBy { (it as Status).value }
200 259  
201 260 return allStatus
202 261 }
203 262  
204   - private fun populatLength(vessel: Vessel): ArrayList<MessageData?> {
  263 + private fun populateLength(vessel: Vessel): ArrayList<MessageData?> {
205 264 val allLength: ArrayList<MessageData?> = vessel.getAllLength()
206 265 allLength.sortBy { (it as Length).value }
207 266  
208 267 return allLength
209 268 }
210 269  
211   - private fun populatWidth(vessel: Vessel): ArrayList<MessageData?> {
  270 + private fun populateWidth(vessel: Vessel): ArrayList<MessageData?> {
212 271 val allWidth: ArrayList<MessageData?> = vessel.getAllWidth()
213 272 allWidth.sortBy { (it as Width).value }
214 273  
215 274 return allWidth
216 275 }
217 276  
218   - private fun populatDraft(vessel: Vessel): ArrayList<MessageData?> {
  277 + private fun populateDraft(vessel: Vessel): ArrayList<MessageData?> {
219 278 val allDraft: ArrayList<MessageData?> = vessel.getAllDraft()
220 279 allDraft.sortBy { (it as Draft).value }
221 280  
222 281 return allDraft
223 282 }
224 283  
225   - private fun populatCargo(vessel: Vessel): ArrayList<MessageData?> {
  284 + private fun populateCargo(vessel: Vessel): ArrayList<MessageData?> {
226 285 val allCargo: ArrayList<MessageData?> = vessel.getAllCargo()
227 286 allCargo.sortBy { (it as Cargo).value }
228 287  
229 288  
230 289  
231 290  
232 291  
233 292  
234 293  
235 294  
236 295  
... ... @@ -244,23 +303,23 @@
244 303  
245 304 data.add(Pair("Heading", populateHeading(vessel)))
246 305  
247   - data.add(Pair("Vessel Name", populatVesselName(vessel)))
  306 + data.add(Pair("Vessel Name", populateVesselName(vessel)))
248 307  
249   - data.add(Pair("IMO", populatIMO(vessel)))
  308 + data.add(Pair("IMO", populateIMO(vessel)))
250 309  
251   - data.add(Pair("Call Sign", populatCallSign(vessel)))
  310 + data.add(Pair("Call Sign", populateCallSign(vessel)))
252 311  
253   - data.add(Pair("Vessel Type", populatVesselType(vessel)))
  312 + data.add(Pair("Vessel Type", populateVesselType(vessel)))
254 313  
255   - data.add(Pair("Status", populatStatus(vessel)))
  314 + data.add(Pair("Status", populateStatus(vessel)))
256 315  
257   - data.add(Pair("Length", populatLength(vessel)))
  316 + data.add(Pair("Length", populateLength(vessel)))
258 317  
259   - data.add(Pair("Width", populatWidth(vessel)))
  318 + data.add(Pair("Width", populateWidth(vessel)))
260 319  
261   - data.add(Pair("Draft", populatDraft(vessel)))
  320 + data.add(Pair("Draft", populateDraft(vessel)))
262 321  
263   - data.add(Pair("Cargo", populatCargo(vessel)))
  322 + data.add(Pair("Cargo", populateCargo(vessel)))
264 323  
265 324 dataList.addAll(data)
266 325 }
src/main/kotlin/application/model/Message.kt View file @ f15a589
... ... @@ -10,11 +10,11 @@
10 10 val speedOverGround = SpeedOverGround(split[4].toDoubleOrNull())
11 11 val courseOverGround = CourseOverGround(split[5].toDoubleOrNull())
12 12 val heading = Heading(split[6].toDoubleOrNull())
13   - val vesselName = VesselName(split[7])
14   - val imo = IMO(split[8])
15   - val callSign = CallSign(split[9])
  13 + val vesselName = VesselName(if (split[7] == "") null else split[7])
  14 + val imo = IMO(if (split[8] == "") null else split[8])
  15 + val callSign = CallSign(if (split[9] == "") null else split[9])
16 16 val vesselType = VesselType(split[10].toIntOrNull())
17   - val status = Status(split[11])
  17 + val status = Status(if (split[11] == "") null else split[11])
18 18 val length = Length(split[12].toDoubleOrNull())
19 19 val width = Width(split[13].toDoubleOrNull())
20 20 val draft = Draft(split[14].toDoubleOrNull())
src/main/resources/gui/dataPanel.fxml View file @ f15a589
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2  
3   -<?import javafx.scene.chart.*?>
4   -<?import javafx.scene.control.*?>
  3 +<?import javafx.scene.control.ListView?>
  4 +<?import javafx.scene.control.SplitPane?>
5 5 <?import javafx.scene.layout.*?>
6   -
7   -<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller.DataPanelController">
8   - <SplitPane dividerPositions="0.1705685618729097" prefHeight="212.0" prefWidth="254.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
9   - <ListView fx:id="dataListView" layoutX="-73.0" layoutY="14.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
10   - <StackPane prefHeight="150.0" prefWidth="200.0">
11   - <ScatterChart fx:id="scatterChartNumber">
12   - <xAxis>
13   - <CategoryAxis side="BOTTOM" fx:id="xaxisNumber" />
14   - </xAxis>
15   - <yAxis>
16   - <NumberAxis fx:id="yaxisNumber" side="LEFT" />
17   - </yAxis>
18   - </ScatterChart>
19   - <ScatterChart fx:id="scatterChartCategory" visible="false">
20   - <xAxis>
21   - <CategoryAxis side="BOTTOM" fx:id="xaxisCategory" />
22   - </xAxis>
23   - <yAxis>
24   - <CategoryAxis fx:id="yaxisCategory" side="LEFT" />
25   - </yAxis>
26   - </ScatterChart>
27   - </StackPane>
  6 +<?import org.charts.dataviewer.javafx.JavaFxDataViewer?>
  7 +<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.241"
  8 + xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.controller.DataPanelController">
  9 + <SplitPane dividerPositions="0.1705685618729097" prefHeight="212.0" prefWidth="254.0" AnchorPane.bottomAnchor="0.0"
  10 + AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
  11 + <ListView fx:id="dataListView" layoutX="-73.0" layoutY="14.0" prefHeight="200.0" prefWidth="200.0"
  12 + AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
  13 + AnchorPane.topAnchor="0.0"/>
  14 + <JavaFxDataViewer fx:id="dataViewer"/>
28 15 </SplitPane>
29 16 </AnchorPane>
src/main/resources/gui/windows.fxml View file @ f15a589
1 1 <?xml version="1.0" encoding="UTF-8"?>
2 2  
3   -<?import javafx.scene.control.SplitPane?>
  3 +<?import javafx.scene.control.*?>
4 4 <?import javafx.scene.layout.*?>
5   -<?import javafx.scene.shape.Line?>
6   -<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="900.0"
7   - prefWidth="1200.0" xmlns="http://javafx.com/javafx/8.0.241" xmlns:fx="http://javafx.com/fxml/1">
  5 +<?import javafx.scene.shape.*?>
  6 +
  7 +<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="900.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
8 8 <children>
9   - <fx:include source="menuBar.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
10   - AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"/>
11   - <SplitPane dividerPositions="0.13772954924874792" layoutY="39.0" prefHeight="865.0" prefWidth="1194.0"
12   - AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
13   - AnchorPane.topAnchor="35.0">
  9 + <fx:include source="menuBar.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
  10 + <SplitPane dividerPositions="0.13772954924874792" layoutY="39.0" prefHeight="865.0" prefWidth="1194.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="35.0">
14 11 <items>
15 12 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
16 13 <children>
17   - <fx:include source="vesselListPanel.fxml" AnchorPane.leftAnchor="0.0"
18   - AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"/>
  14 + <fx:include source="vesselListPanel.fxml" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
19 15 </children>
20 16 </AnchorPane>
21 17 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
22 18 <children>
23   - <SplitPane dividerPositions="0.536" layoutX="127.0" layoutY="74.0" orientation="VERTICAL"
24   - prefHeight="200.0" prefWidth="160.0" AnchorPane.bottomAnchor="0.0"
25   - AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
  19 + <SplitPane dividerPositions="0.536" layoutX="127.0" layoutY="74.0" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
26 20 <items>
27   - <fx:include source="mapPanel.fxml"/>
28   - <fx:include source="dataPanel.fxml"/>
  21 + <fx:include source="mapPanel.fxml" />
  22 + <fx:include source="dataPanel.fxml" />
29 23 </items>
30 24 </SplitPane>
31 25 </children>
32 26 </AnchorPane>
33 27 </items>
34 28 </SplitPane>
35   - <Line endX="1101.0" endY="1.1444091796875E-5" layoutX="101.0" layoutY="35.0" startX="-100.0"/>
  29 + <Line endX="3000.0" layoutX="101.0" layoutY="35.0" startX="-100.0" AnchorPane.leftAnchor="-3.0" AnchorPane.rightAnchor="0.0" />
36 30 </children>
37 31 </AnchorPane>