/Users/johnr/Dropbox/johnrayworth.info/largeFilesOutsideJSR/__IB-Other/Other/IA-Solutions-2019/Alex/Product/BeachPicker/src/com/hyltonboy/beachpicker/GUI.java |
1
2
3
4
5
6 package com.hyltonboy.beachpicker;
7
8 import com.hyltonboy.beachpicker.place.Place;
9 import com.hyltonboy.beachpicker.util.Sort;
10 import java.awt.Color;
11 import java.awt.Component;
12 import java.io.BufferedReader;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.io.InputStreamReader;
16 import java.io.UnsupportedEncodingException;
17 import java.net.InetSocketAddress;
18 import java.net.MalformedURLException;
19 import java.net.Socket;
20 import java.net.URL;
21 import java.net.URLEncoder;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.logging.Level;
25 import java.util.logging.Logger;
26 import javax.swing.JOptionPane;
27 import javax.swing.table.DefaultTableModel;
28 import org.json.JSONArray;
29 import org.json.JSONObject;
30
31
32
33 @author
34
35 public class GUI extends javax.swing.JFrame {
36
37 private double LONGITUDE_LIMIT = 180.0;
38 private double LATITUDE_LIMIT = 90.0;
39
40 private boolean hasInternet = false;
41
42 private JSONArray jsonResults = null;
43
44 private String weatherAPIBase = "api.openweathermap.org/data/2.5/weather?";
45 private String weatherAPIKey = "&APPID=82769701a4e9cff3cc5cad5e8a0ca0e2";
46 private double locationLat;
47 private double locationLon;
48 private ArrayList<Place> places = new ArrayList<Place>();
49 private Place[] placesArray;
50
51
52
53
54 public GUI() {
55 initComponents();
56 hasInternetConnection();
57 System.out.println(hasInternet);
58 }
59
264
265 private void verifyLocationBMouseReleased(java.awt.event.MouseEvent evt) {
266 boolean success = false;
267
268 Component selectedComponent = locationSourceTP.getSelectedComponent();
269 if(selectedComponent == coordinatesP) {
270
271 success = verifyCoordinates(longitudeTB.getText(), latitudeTB.getText());
272 } else if(selectedComponent == addressP) {
273
274 success = verifyAddress(addressTB.getText());
275 }
276
277
278 if(success) {
279 JOptionPane.showMessageDialog(this, "The location was successfully verified!","Success", JOptionPane.PLAIN_MESSAGE);
280 } else {
281 JOptionPane.showMessageDialog(this, "The location could not be verified; please check your input and internet connection!","Failure", JOptionPane.PLAIN_MESSAGE);
282 }
283 }
284
285 private void longitudeTBActionPerformed(java.awt.event.ActionEvent evt) {
286
287 }
288
289
290 @param args
291
292 public static void main(String args[]) {
293
294
295
296
297
298 try {
299 for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
300 if ("System".equals(info.getName())) {
301 javax.swing.UIManager.setLookAndFeel(info.getClassName());
302 break;
303 }
304 }
305 } catch (ClassNotFoundException ex) {
306 java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
307 } catch (InstantiationException ex) {
308 java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
309 } catch (IllegalAccessException ex) {
310 java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
311 } catch (javax.swing.UnsupportedLookAndFeelException ex) {
312 java.util.logging.Logger.getLogger(GUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
313 }
314
315
316
317 java.awt.EventQueue.invokeLater(new Runnable() {
318 public void run() {
319 new GUI().setVisible(true);
320 }
321 });
322 }
323
324 // Variables declaration - do not modify
325 private javax.swing.JLabel addressL;
326 private javax.swing.JPanel addressP;
327 private javax.swing.JTextField addressTB;
328 private javax.swing.JPanel coordinatesP;
329 private javax.swing.JPanel initP;
330 private javax.swing.JLabel latitudeL;
331 private javax.swing.JTextField latitudeTB;
332 private javax.swing.JLabel locationSourceL;
333 private javax.swing.JLabel locationSourceL1;
334 private javax.swing.JTabbedPane locationSourceTP;
335 private javax.swing.JLabel longitudeL;
336 private javax.swing.JTextField longitudeTB;
337 private javax.swing.JTabbedPane mainTP;
338 private javax.swing.JPanel resultsP;
339 private javax.swing.JScrollPane resultsSP;
340 private javax.swing.JTable resultsT;
341 private javax.swing.JLabel statusL;
342 private javax.swing.JButton verifyLocationB;
343 // End of variables declaration
344
345 private boolean verifyCoordinates(String longitudeString, String latitudeString) {
346 if(hasInternetConnection()) {
347
348 double longitude = -999;
349 double latitude = -999;
350 try {
351 longitude = Double.parseDouble(longitudeString);
352 latitude = Double.parseDouble(latitudeString);
353 } catch (NumberFormatException e) {
354 return false;
355 }
356
357 JSONArray queryJSON = null;
358
359
360 if (longitude >= -LONGITUDE_LIMIT && longitude <= LONGITUDE_LIMIT && latitude >= -LATITUDE_LIMIT && latitude <= LATITUDE_LIMIT) {
361 queryJSON = queryOSM(latitude, longitude);
362 }
363 if(queryJSON == null) {
364 return false;
365 } else {
366 jsonResults = queryJSON;
367 JSONObject j = (JSONObject) jsonResults.get(0);
368 double lat = Double.parseDouble((String) j.get("lat"));
369 double lon = Double.parseDouble((String) j.get("lon"));
370
371 parseResults(jsonResults, null);
372 return (queryJSON.length() > 0);
373 }
374 } else {
375 return false;
376 }
377 }
378
379 private boolean verifyAddress(String address) {
380 if(hasInternetConnection()) {
381 JSONArray queryJSON = queryOSM(address);
382 if(queryJSON == null || queryJSON.isEmpty()|| queryJSON.isNull(0)) {
383 return false;
384 } else {
385 jsonResults = queryJSON;
386
387 JSONObject j = (JSONObject) jsonResults.get(0);
388 JSONObject addressObject = j.getJSONObject("address");
389 String country = addressObject.getString("country");
390 String state = addressObject.getString("state");
391 JSONArray nearbyBeaches = null;
392 if(state != "") {
393 nearbyBeaches = queryOSM("beach near " + state + ", " + country);
394 }
395 locationLat = Double.parseDouble((String) j.get("lat"));
396 locationLon = Double.parseDouble((String) j.get("lon"));
397
398 parseResults(nearbyBeaches, null);
399 return (queryJSON.length() > 0);
400 }
401 }
402 return false;
403 }
404
405 private JSONArray queryOWM(String query) {
406 try {
407 StringBuilder queryURL = new StringBuilder();
408 queryURL.append(weatherAPIBase);
409 queryURL.append(URLEncoder.encode(query, "UTF-8").replaceAll("\\+", "%20"));
410 queryURL.append(weatherAPIKey);
411 URL url = new URL(queryURL.toString());
412 System.out.println(queryURL.toString());
413 InputStream urlStream = url.openConnection().getInputStream();
414 BufferedReader urlReader = new BufferedReader(new InputStreamReader(urlStream));
415 StringBuilder jsonString = new StringBuilder();
416 String currentLine;
417 while((currentLine = urlReader.readLine()) != null) {
418 jsonString.append(currentLine);
419 }
420 urlReader.close();
421 System.out.println(jsonString.toString());
422 JSONArray jsonArray = new JSONArray(jsonString.toString());
423 return jsonArray;
424 } catch (MalformedURLException ex) {
425
426 return null;
427 } catch (IOException ex) {
428
429 return null;
430 }
431 }
432
433 private JSONArray queryOSM(String address) {
434 try {
435 StringBuilder queryURL = new StringBuilder();
436 queryURL.append("https://nominatim.openstreetmap.org/search/");
437 queryURL.append(URLEncoder.encode(address, "UTF-8").replaceAll("\\+", "%20"));
438 queryURL.append("?format=json&addressdetails=1");
439
440 URL url = new URL(queryURL.toString());
441 System.out.println(queryURL.toString());
442 InputStream urlStream = url.openConnection().getInputStream();
443 BufferedReader urlReader = new BufferedReader(new InputStreamReader(urlStream));
444 StringBuilder jsonString = new StringBuilder();
445 String currentLine;
446 while((currentLine = urlReader.readLine()) != null) {
447 jsonString.append(currentLine);
448 }
449 urlReader.close();
450 System.out.println(jsonString.toString());
451 JSONArray jsonArray = new JSONArray(jsonString.toString());
452 return jsonArray;
453 } catch (MalformedURLException ex) {
454
455 return null;
456 } catch (IOException ex) {
457
458 return null;
459 }
460 }
461
462 private double degToRad(double degrees) {
463 return degrees * Math.PI / 180;
464 }
465
466 private double distanceCoords(double lat1, double lon1, double lat2, double lon2) {
467 double radius = 6371;
468
469 double lat = degToRad(lat2-lat1);
470 double lon = degToRad(lon2-lon1);
471
472 lat1 = degToRad(lat1);
473 lat2 = degToRad(lat2);
474
475 double a = Math.sin(lat/2) * Math.sin(lat/2) + Math.sin(lon/2) * Math.sin(lon/2) * Math.cos(lat1) * Math.cos(lat2);
476 double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
477 return radius * c;
478 }
479
480 private JSONArray queryOSM(double latitude, double longitude) {
481 try {
482 StringBuilder queryURL = new StringBuilder();
483 queryURL.append("https://nominatim.openstreetmap.org/reverse?");
484 queryURL.append("format=json&addressdetails=1");
485 queryURL.append("&lat=");
486 queryURL.append(latitude);
487 queryURL.append("&lon=");
488 queryURL.append(longitude);
489 queryURL.append("?format=json&addressdetails=1");
490
491 URL url = new URL(queryURL.toString());
492 System.out.println(queryURL.toString());
493 InputStream urlStream = url.openConnection().getInputStream();
494 BufferedReader urlReader = new BufferedReader(new InputStreamReader(urlStream));
495 StringBuilder jsonString = new StringBuilder();
496 String currentLine;
497 while((currentLine = urlReader.readLine()) != null) {
498 jsonString.append(currentLine);
499 }
500 urlReader.close();
501 System.out.println(jsonString.toString());
502 JSONArray jsonArray = new JSONArray(jsonString.toString());
503 return jsonArray;
504 } catch (MalformedURLException ex) {
505
506 return null;
507 } catch (IOException ex) {
508
509 return null;
510 }
511 }
512
513 private boolean hasInternetConnection() {
514 boolean connection = false;
515 try {
516 String address = "google.com";
517 int port = 80;
518 int timeout = 1000;
519 Socket socket = new Socket();
520 socket.connect(new InetSocketAddress(address, port), timeout);
521
522 statusL.setText("Connected to the internet! All features should work!");
523 statusL.setForeground(Color.GREEN.darker());
524 connection = true;
525 } catch (IOException ex) {
526
527 statusL.setText("No internet connection. Some features will only work with internet!");
528 statusL.setForeground(Color.RED.darker());
529 connection = false;
530 }
531 hasInternet = connection;
532 return connection;
533 }
534
535 private void parseResults(JSONArray jsonArray, JSONArray weatherArray) {
536 DefaultTableModel model = (DefaultTableModel) resultsT.getModel();
537 model.setRowCount(jsonArray.length());
538
539 for(int i = 0; i < jsonArray.length(); i++) {
540
541
542 JSONObject jsonObject = (JSONObject) jsonArray.get(i);
543 String displayName = (String) jsonObject.get("display_name");
544 double lat = Double.parseDouble((String) jsonObject.get("lat"));
545 double lon = Double.parseDouble((String) jsonObject.get("lon"));
546 double dist = distanceCoords(lat, lon, locationLat, locationLon);
547
548 String hotelLink = "";
549 String mapsLink = "";
550 try {
551 mapsLink = "http://maps.google.com/maps?q=" + URLEncoder.encode(displayName, "UTF-8");
552 hotelLink = "https://www.expedia.com/Hotel-Search?destination=" + URLEncoder.encode(displayName, "UTF-8") + "&startDate=&endDate=&rooms=1&adults=2";
553 } catch (UnsupportedEncodingException ex) {
554 Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
555 }
556
557 Place place = new Place((String) jsonObject.get("display_name"), lat, lon, hotelLink, mapsLink, dist);
558 places.add(place);
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583 }
584
585
586
587
588
589
590
591
592
593 for(int i = 0; i < places.size(); i++) {
594 resultsT.setValueAt(places.get(i).getInfoLink(), i, 2);
595 resultsT.setValueAt(places.get(i).getMapLink(), i, 3);
596 resultsT.setValueAt(places.get(i).getDistance(), i, 1);
597 resultsT.setValueAt(places.get(i).getPlaceName(), i, 0);
598 }
599 }
600
601 }
602
/*
####################################################################
####################################################################
####################################################################
####################################################################
####################################################################
*************** NOTE THAT ALL THE CODE WHICH IS ********************
*************** HIGHLIGHTED GREY BLOCK IS AUTO- ********************
*************** GENERATED FROM NETBEANS, NOT BY ********************
*************** ME. (It's mainly the GUI stuff.)********************
####################################################################
####################################################################
####################################################################
####################################################################
####################################################################
*/
60
61 This method is called from within the constructor to initialize the form.
62
63
64
65 @SuppressWarnings("unchecked")
66 // <editor-fold defaultstate="collapsed" desc="Generated Code">
67 private void initComponents() {
68
69 mainTP = new javax.swing.JTabbedPane();
70 initP = new javax.swing.JPanel();
71 locationSourceL = new javax.swing.JLabel();
72 locationSourceTP = new javax.swing.JTabbedPane();
73 coordinatesP = new javax.swing.JPanel();
74 longitudeL = new javax.swing.JLabel();
75 latitudeL = new javax.swing.JLabel();
76 longitudeTB = new javax.swing.JTextField();
77 latitudeTB = new javax.swing.JTextField();
78 addressP = new javax.swing.JPanel();
79 addressL = new javax.swing.JLabel();
80 addressTB = new javax.swing.JTextField();
81 verifyLocationB = new javax.swing.JButton();
82 locationSourceL1 = new javax.swing.JLabel();
83 resultsP = new javax.swing.JPanel();
84 resultsSP = new javax.swing.JScrollPane();
85 resultsT = new javax.swing.JTable();
86 statusL = new javax.swing.JLabel();
87
88 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
89 setTitle("Beach Picker v0.1.0");
90 setResizable(false);
91
92 locationSourceL.setText("How would you like to choose your desired location?");
93
94 longitudeL.setText("Longitude");
95
96 latitudeL.setText("Latitude");
97
98 longitudeTB.setToolTipText("");
99 longitudeTB.addActionListener(new java.awt.event.ActionListener() {
100 public void actionPerformed(java.awt.event.ActionEvent evt) {
101 longitudeTBActionPerformed(evt);
102 }
103 });
104
105 javax.swing.GroupLayout coordinatesPLayout = new javax.swing.GroupLayout(coordinatesP);
106 coordinatesP.setLayout(coordinatesPLayout);
107 coordinatesPLayout.setHorizontalGroup(
108 coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
109 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, coordinatesPLayout.createSequentialGroup()
110 .addContainerGap(128, Short.MAX_VALUE)
111 .addGroup(coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
112 .addComponent(latitudeL)
113 .addComponent(longitudeL))
114 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
115 .addGroup(coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
116 .addComponent(latitudeTB)
117 .addComponent(longitudeTB, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE))
118 .addGap(117, 117, 117))
119 );
120 coordinatesPLayout.setVerticalGroup(
121 coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
122 .addGroup(coordinatesPLayout.createSequentialGroup()
123 .addGroup(coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
124 .addComponent(longitudeL)
125 .addComponent(longitudeTB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
126 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
127 .addGroup(coordinatesPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
128 .addComponent(latitudeL)
129 .addComponent(latitudeTB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
130 .addGap(0, 4, Short.MAX_VALUE))
131 );
132
133 locationSourceTP.addTab("Coordinates", coordinatesP);
134
135 addressL.setText("Type the address or place name below");
136
137 javax.swing.GroupLayout addressPLayout = new javax.swing.GroupLayout(addressP);
138 addressP.setLayout(addressPLayout);
139 addressPLayout.setHorizontalGroup(
140 addressPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
141 .addGroup(addressPLayout.createSequentialGroup()
142 .addContainerGap()
143 .addComponent(addressTB)
144 .addContainerGap())
145 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addressPLayout.createSequentialGroup()
146 .addContainerGap(77, Short.MAX_VALUE)
147 .addComponent(addressL)
148 .addGap(87, 87, 87))
149 );
150 addressPLayout.setVerticalGroup(
151 addressPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
152 .addGroup(addressPLayout.createSequentialGroup()
153 .addContainerGap()
154 .addComponent(addressL)
155 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
156 .addComponent(addressTB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
157 .addContainerGap(8, Short.MAX_VALUE))
158 );
159
160 locationSourceTP.addTab("Address", addressP);
161
162 verifyLocationB.setText("Search");
163 verifyLocationB.addMouseListener(new java.awt.event.MouseAdapter() {
164 public void mouseReleased(java.awt.event.MouseEvent evt) {
165 verifyLocationBMouseReleased(evt);
166 }
167 });
168
169 locationSourceL1.setText("This address should be your current location.");
170
171 javax.swing.GroupLayout initPLayout = new javax.swing.GroupLayout(initP);
172 initP.setLayout(initPLayout);
173 initPLayout.setHorizontalGroup(
174 initPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
175 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, initPLayout.createSequentialGroup()
176 .addGap(0, 0, Short.MAX_VALUE)
177 .addGroup(initPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
178 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, initPLayout.createSequentialGroup()
179 .addComponent(locationSourceL, javax.swing.GroupLayout.PREFERRED_SIZE, 341, javax.swing.GroupLayout.PREFERRED_SIZE)
180 .addGap(189, 189, 189))
181 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, initPLayout.createSequentialGroup()
182 .addComponent(locationSourceL1)
183 .addGap(213, 213, 213))))
184 .addGroup(initPLayout.createSequentialGroup()
185 .addGroup(initPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
186 .addGroup(initPLayout.createSequentialGroup()
187 .addGap(282, 282, 282)
188 .addComponent(verifyLocationB))
189 .addGroup(initPLayout.createSequentialGroup()
190 .addGap(138, 138, 138)
191 .addComponent(locationSourceTP, javax.swing.GroupLayout.PREFERRED_SIZE, 425, javax.swing.GroupLayout.PREFERRED_SIZE)))
192 .addContainerGap(151, Short.MAX_VALUE))
193 );
194 initPLayout.setVerticalGroup(
195 initPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
196 .addGroup(initPLayout.createSequentialGroup()
197 .addContainerGap()
198 .addComponent(locationSourceL)
199 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
200 .addComponent(locationSourceL1)
201 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
202 .addComponent(locationSourceTP, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
203 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
204 .addComponent(verifyLocationB)
205 .addContainerGap(355, Short.MAX_VALUE))
206 );
207
208 mainTP.addTab("Initialize", initP);
209
210 resultsT.setModel(new javax.swing.table.DefaultTableModel(
211 new Object [][] {
212 {null, null, null, null},
213 {null, null, null, null},
214 {null, null, null, null},
215 {null, null, null, null}
216 },
217 new String [] {
218 "Address", "Distance", "Hotel Listings", "Google Maps"
219 }
220 ));
221 resultsSP.setViewportView(resultsT);
222
223 javax.swing.GroupLayout resultsPLayout = new javax.swing.GroupLayout(resultsP);
224 resultsP.setLayout(resultsPLayout);
225 resultsPLayout.setHorizontalGroup(
226 resultsPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
227 .addGroup(resultsPLayout.createSequentialGroup()
228 .addContainerGap()
229 .addComponent(resultsSP, javax.swing.GroupLayout.DEFAULT_SIZE, 702, Short.MAX_VALUE)
230 .addContainerGap())
231 );
232 resultsPLayout.setVerticalGroup(
233 resultsPLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
234 .addGroup(resultsPLayout.createSequentialGroup()
235 .addContainerGap()
236 .addComponent(resultsSP, javax.swing.GroupLayout.PREFERRED_SIZE, 496, javax.swing.GroupLayout.PREFERRED_SIZE)
237 .addContainerGap(52, Short.MAX_VALUE))
238 );
239
240 mainTP.addTab("Results", resultsP);
241
242 statusL.setForeground(new java.awt.Color(255, 102, 102));
243 statusL.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
244 statusL.setVerticalAlignment(javax.swing.SwingConstants.TOP);
245
246 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
247 getContentPane().setLayout(layout);
248 layout.setHorizontalGroup(
249 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
250 .addComponent(mainTP)
251 .addComponent(statusL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
252 );
253 layout.setVerticalGroup(
254 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
255 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
256 .addContainerGap()
257 .addComponent(mainTP, javax.swing.GroupLayout.PREFERRED_SIZE, 600, javax.swing.GroupLayout.PREFERRED_SIZE)
258 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
259 .addComponent(statusL, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE))
260 );
261
262 pack();
263 }// </editor-fold>