patternjavaMinor
Tracking Containers in a Train Station
Viewed 0 times
trackingcontainerstrainstation
Problem
This is a time line for control over the events of some containers in a train station.
It gets all the data to build the time line by getting a JSON from a database via REST service. The app resets every minute to refresh the results and every dot representing a container has some info in a tooltip activated by hovering the mouse.
The app needs 3 external libraries:
There is also a webstart test version online, please use Firefox if you want to try it out: http://www.abaxomol.com/dist/ContenedoresChart.html
ContenedoresChart.java
```
public class ContenedoresChart extends Application {
DrawDots drawDots = new DrawDots();
static DotsArrays dotsArrays = new DotsArrays();
final static NumberAxis xAxis = new NumberAxis();
final static CategoryAxis yAxis = new CategoryAxis();
final static LineChart sc = new
LineChart<>(xAxis,yAxis);
static String fullJSON = "";
@Override
public void start(Stage primaryStage) {
NumberAxis xAxis = new NumberAxis();
CategoryAxis yAxis = new CategoryAxis();
LineChart sc = new
LineChart<>(xAxis,yAxis);
Get_JSON_String.getJSONString();
primaryStage.setTitle("Ferroservicios");
DateFormatter.dateFormatter(xAxis);
xAxis.setLabel("Fecha");
yAxis.setLabel("Contenedores");
sc.setTitle("Eventos de Contenedores");
SeparateContenedores.loadDots(sc);
//sc.setLegendVisible(false);
SetTooltip.setTooltip();
SetTooltip.setSeriesStyle(sc);
LegendItems.setItems(sc);
LegendItems.setTransparent();
Legend legend = (Legend)sc.lookup(".chart-legend");
legend.getItems().removeIf(item->item.getText().equals("hide"));
Scene scene = new Scene(sc, 1200, 1000);
//primaryStage.setMaximized(true);
primaryS
It gets all the data to build the time line by getting a JSON from a database via REST service. The app resets every minute to refresh the results and every dot representing a container has some info in a tooltip activated by hovering the mouse.
The app needs 3 external libraries:
- commons-io-2.4.jar
- guava-18.0.jar
- json-simple-1.1.1.jar
There is also a webstart test version online, please use Firefox if you want to try it out: http://www.abaxomol.com/dist/ContenedoresChart.html
ContenedoresChart.java
```
public class ContenedoresChart extends Application {
DrawDots drawDots = new DrawDots();
static DotsArrays dotsArrays = new DotsArrays();
final static NumberAxis xAxis = new NumberAxis();
final static CategoryAxis yAxis = new CategoryAxis();
final static LineChart sc = new
LineChart<>(xAxis,yAxis);
static String fullJSON = "";
@Override
public void start(Stage primaryStage) {
NumberAxis xAxis = new NumberAxis();
CategoryAxis yAxis = new CategoryAxis();
LineChart sc = new
LineChart<>(xAxis,yAxis);
Get_JSON_String.getJSONString();
primaryStage.setTitle("Ferroservicios");
DateFormatter.dateFormatter(xAxis);
xAxis.setLabel("Fecha");
yAxis.setLabel("Contenedores");
sc.setTitle("Eventos de Contenedores");
SeparateContenedores.loadDots(sc);
//sc.setLegendVisible(false);
SetTooltip.setTooltip();
SetTooltip.setSeriesStyle(sc);
LegendItems.setItems(sc);
LegendItems.setTransparent();
Legend legend = (Legend)sc.lookup(".chart-legend");
legend.getItems().removeIf(item->item.getText().equals("hide"));
Scene scene = new Scene(sc, 1200, 1000);
//primaryStage.setMaximized(true);
primaryS
Solution
public class DateFormatter {
static String date1 = "";
static String date2 = "";
static String date3 = "";
static String date4 = "";
static String date5 = "";
static String date6 = "";
static String date7 = "";
public static void dateFormatter(NumberAxis xAxis){
loadDates();
xAxis.setLowerBound(0.0);
xAxis.setUpperBound(7.4);
xAxis.setAutoRanging(false);
xAxis.setTickUnit(1);
xAxis.setTickLabelFormatter(new StringConverter() {
@Override
public String toString(Number n) {
if (n.equals(1.00)) return date1;
if (n.equals(2.00)) return date2;
if (n.equals(3.00)) return date3;
if (n.equals(4.00)) return date4;
if (n.equals(5.00)) return date5;
if (n.equals(6.00)) return date6;
if (n.equals(7.00)) return date7;
return "";
}
@Override
public Number fromString(String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
}
public static void loadDates(){
try {
JSONParser parser = new JSONParser();
String urlJSON = ContenedoresChart.fullJSON;
JSONObject JSON_obj = (JSONObject) JSONValue.parseWithException(urlJSON);
//set the value of the dates
JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
date1 = String.valueOf(namesArray.get("date1"));
date2 = String.valueOf(namesArray.get("date2"));
date3 = String.valueOf(namesArray.get("date3"));
date4 = String.valueOf(namesArray.get("date4"));
date5 = String.valueOf(namesArray.get("date5"));
date6 = String.valueOf(namesArray.get("date6"));
date7 = String.valueOf(namesArray.get("date7"));
} catch (ParseException e) {
//ErrorHandling.showException();
}
}
}Looks good!
But then people say "Can we have a setting to pick how many labels we want to use?" and you're practically screwed. Especially if they want 1 for each day of the month. You'd have to add
date8 through date31. That's a lot of typing.I'd use lists instead:
This
static String date1 = "";
static String date2 = "";
static String date3 = "";
static String date4 = "";
static String date5 = "";
static String date6 = "";
static String date7 = "";Becomes this
static List dates = new ArrayList();This
@Override
public String toString(Number n) {
if (n.equals(1.00)) return date1;
if (n.equals(2.00)) return date2;
if (n.equals(3.00)) return date3;
if (n.equals(4.00)) return date4;
if (n.equals(5.00)) return date5;
if (n.equals(6.00)) return date6;
if (n.equals(7.00)) return date7;
return "";
}Becomes this
@Override
public String toString(Number n) {
int index = n.intValue()-1;
if(0 <= index && index < dates.size()){
return dates.get(index);
}
return "";
}And this
JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
date1 = String.valueOf(namesArray.get("date1"));
date2 = String.valueOf(namesArray.get("date2"));
date3 = String.valueOf(namesArray.get("date3"));
date4 = String.valueOf(namesArray.get("date4"));
date5 = String.valueOf(namesArray.get("date5"));
date6 = String.valueOf(namesArray.get("date6"));
date7 = String.valueOf(namesArray.get("date7"));Becomes this.
dates.clear();
JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
for(int i = 1; namesArray.has("date" + i); i++){
dates.add(String.valueOf(namesArray.get("date"+i)));
}You might need to check if you can use
has or whether you need something like hasString or hasKey or containsKey. The end result looks a lot better:
```
public class DateFormatter {
static List dates = new ArrayList();
public static void dateFormatter(NumberAxis xAxis){
loadDates();
xAxis.setLowerBound(0.0);
xAxis.setUpperBound(7.4);
xAxis.setAutoRanging(false);
xAxis.setTickUnit(1);
xAxis.setTickLabelFormatter(new StringConverter() {
@Override
public String toString(Number n) {
int index = n.intValue()-1;
if(0 <= index && index < dates.size()){
return dates.get(index);
}
return "";
}
@Override
public Number fromString(String string) {
throw new UnsupportedOperationExce
Code Snippets
public class DateFormatter {
static String date1 = "";
static String date2 = "";
static String date3 = "";
static String date4 = "";
static String date5 = "";
static String date6 = "";
static String date7 = "";
public static void dateFormatter(NumberAxis xAxis){
loadDates();
xAxis.setLowerBound(0.0);
xAxis.setUpperBound(7.4);
xAxis.setAutoRanging(false);
xAxis.setTickUnit(1);
xAxis.setTickLabelFormatter(new StringConverter<Number>() {
@Override
public String toString(Number n) {
if (n.equals(1.00)) return date1;
if (n.equals(2.00)) return date2;
if (n.equals(3.00)) return date3;
if (n.equals(4.00)) return date4;
if (n.equals(5.00)) return date5;
if (n.equals(6.00)) return date6;
if (n.equals(7.00)) return date7;
return "";
}
@Override
public Number fromString(String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
}
public static void loadDates(){
try {
JSONParser parser = new JSONParser();
String urlJSON = ContenedoresChart.fullJSON;
JSONObject JSON_obj = (JSONObject) JSONValue.parseWithException(urlJSON);
//set the value of the dates
JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
date1 = String.valueOf(namesArray.get("date1"));
date2 = String.valueOf(namesArray.get("date2"));
date3 = String.valueOf(namesArray.get("date3"));
date4 = String.valueOf(namesArray.get("date4"));
date5 = String.valueOf(namesArray.get("date5"));
date6 = String.valueOf(namesArray.get("date6"));
date7 = String.valueOf(namesArray.get("date7"));
} catch (ParseException e) {
//ErrorHandling.showException();
}
}
}static String date1 = "";
static String date2 = "";
static String date3 = "";
static String date4 = "";
static String date5 = "";
static String date6 = "";
static String date7 = "";static List<String> dates = new ArrayList<String>();@Override
public String toString(Number n) {
if (n.equals(1.00)) return date1;
if (n.equals(2.00)) return date2;
if (n.equals(3.00)) return date3;
if (n.equals(4.00)) return date4;
if (n.equals(5.00)) return date5;
if (n.equals(6.00)) return date6;
if (n.equals(7.00)) return date7;
return "";
}@Override
public String toString(Number n) {
int index = n.intValue()-1;
if(0 <= index && index < dates.size()){
return dates.get(index);
}
return "";
}Context
StackExchange Code Review Q#121650, answer score: 7
Revisions (0)
No revisions yet.