From 1aba3b203dd556833e3e3daccd55b45ab8b0a817 Mon Sep 17 00:00:00 2001 From: lois Date: Sat, 18 May 2024 22:27:29 +0800 Subject: [PATCH 1/7] pom, parse and geomap modified --- pom.xml | 6 + .../java/edu/project/yourpackage/Parse.java | 375 ++++++++++++++++++ 2 files changed, 381 insertions(+) create mode 100644 src/main/java/edu/project/yourpackage/Parse.java diff --git a/pom.xml b/pom.xml index a407174..c62264f 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,12 @@ flatlaf 3.4.1 + + + com.google.code.gson + gson + 2.8.5 + diff --git a/src/main/java/edu/project/yourpackage/Parse.java b/src/main/java/edu/project/yourpackage/Parse.java new file mode 100644 index 0000000..cc2a859 --- /dev/null +++ b/src/main/java/edu/project/yourpackage/Parse.java @@ -0,0 +1,375 @@ +package edu.project.yourpackage; + +import com.google.gson.Gson; + +public class Parse + { + private final String cod; + private final double message; + private final int cnt; + private final List[] list; + private final City city; + + public Parse(String cod, double message, int cnt, List[] list, City city) + { + this.cod = cod; + this.message = message; + this.cnt = cnt; + this.list = list; + this.city = city; + } + + public static Parse fromJson(String json) + { + Gson gson = new Gson(); + return gson.fromJson(json, Parse.class); + } + + public String getCod() + { + return cod; + } + + public double getMessage() + { + return message; + } + + public int getCnt() + { + return cnt; + } + + public List[] getList() + { + return list; + } + + public City getCity() + { + return city; + } + + public static class List + { + private final int dt; + private final Main main; + private final Weather[] weather; + private final Clouds clouds; + private final Wind wind; + private final int visibility; + private final double pop; + private final Sys sys; + private final String dt_txt; + + public List(int dt, Main main, Weather[] weather, Clouds clouds, Wind wind, int visibility, double pop, Sys sys, String dt_txt) + { + this.dt = dt; + this.main = main; + this.weather = weather; + this.clouds = clouds; + this.wind = wind; + this.visibility = visibility; + this.pop = pop; + this.sys = sys; + this.dt_txt = dt_txt; + } + + public int getDt() + { + return dt; + } + + public Main getMain() + { + return main; + } + + public Weather[] getWeather() + { + return weather; + } + + public Clouds getClouds() + { + return clouds; + } + + public Wind getWind() + { + return wind; + } + + public int getVisibility() + { + return visibility; + } + + public double getPop() + { + return pop; + } + + public Sys getSys() + { + return sys; + } + + public String getDt_txt() + { + return dt_txt; + } + } + + public static class Main + { + private final double temp; + private final double feels_like; + private final double temp_min; + private final double temp_max; + private final int pressure; + private final int sea_level; + private final int grnd_level; + private final int humidity; + private final double temp_kf; + + public Main(double temp, double feels_like, double temp_min, double temp_max, int pressure, int sea_level, int grnd_level, int humidity, double temp_kf) + { + this.temp = temp; + this.feels_like = feels_like; + this.temp_min = temp_min; + this.temp_max = temp_max; + this.pressure = pressure; + this.sea_level = sea_level; + this.grnd_level = grnd_level; + this.humidity = humidity; + this.temp_kf = temp_kf; + } + + public double getTemp() + { + return temp; + } + + public double getFeels_like() + { + return feels_like; + } + + public double getTemp_min() + { + return temp_min; + } + + public double getTemp_max() + { + return temp_max; + } + + public int getPressure() + { + return pressure; + } + + public int getSea_level() + { + return sea_level; + } + + public int getGrnd_level() + { + return grnd_level; + } + + public int getHumidity() + { + return humidity; + } + + public double getTemp_kf() + { + return temp_kf; + } + } + + public static class Weather + { + private final int id; + private final String main; + private final String description; + private final String icon; + + public Weather(int id, String main, String description, String icon) + { + this.id = id; + this.main = main; + this.description = description; + this.icon = icon; + } + + public int getId() + { + return id; + } + + public String getMain() + { + return main; + } + + public String getDescription() + { + return description; + } + + public String getIcon() + { + return icon; + } + } + + public static class Clouds + { + private final int all; + + public Clouds(int all) + { + this.all = all; + } + + public int getAll() + { + return all; + } + } + + public static class Wind + { + private final double speed; + private final int deg; + private final double gust; + + public Wind(double speed, int deg, double gust) + { + this.speed = speed; + this.deg = deg; + this.gust = gust; + } + + public double getSpeed() + { + return speed; + } + + public int getDeg() + { + return deg; + } + + public double getGust() + { + return gust; + } + } + + public static class Sys + { + private final String pod; + + public Sys(String pod) + { + this.pod = pod; + } + + public String getPod() + { + return pod; + } + } + + public static class City + { + private final int id; + private final String name; + private final Coord coord; + private final String country; + private final int population; + private final int timezone; + private final long sunrise; + private final long sunset; + + public City(int id, String name, Coord coord, String country, int population, int timezone, long sunrise, long sunset) + { + this.id = id; + this.name = name; + this.coord = coord; + this.country = country; + this.population = population; + this.timezone = timezone; + this.sunrise = sunrise; + this.sunset = sunset; + } + + public int getId() + { + return id; + } + + public String getName() + { + return name; + } + + public Coord getCoord() + { + return coord; + } + + public String getCountry() + { + return country; + } + + public int getPopulation() + { + return population; + } + + public int getTimezone() + { + return timezone; + } + + public long getSunrise() + { + return sunrise; + } + + public long getSunset() + { + return sunset; + } + } + + public static class Coord + { + private final double lat; + private final double lon; + + public Coord(double lat, double lon) + { + this.lat = lat; + this.lon = lon; + } + + public double getLat() + { + return lat; + } + + public double getLon() + { + return lon; + } + } +} From b81de21bca91018381c4678a093d896b1db37d22 Mon Sep 17 00:00:00 2001 From: lois Date: Sat, 18 May 2024 22:44:27 +0800 Subject: [PATCH 2/7] parse, pom and other modifications --- .../java/edu/project/components/GeoMap.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index 24a729c..91247b4 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -20,22 +20,25 @@ import edu.project.Context; import edu.project.tilesets.HybridTileFactory; -public class GeoMap extends JXMapKit { - public GeoMap(Context context) { +public class GeoMap extends JXMapKit +{ + public GeoMap(Context context) + { setDefaultProvider(DefaultProviders.Custom); setTileFactory(new HybridTileFactory()); JXMapViewer mainMap = getMainMap(); - mainMap.setBorder(new EmptyBorder(10, 10, 10, 10)); // Add 10px inner-padding - mainMap.setOverlayPainter(null); // Remove attribution painter set by JXMapKit - for (MouseListener listener : mainMap.getMouseListeners()) { - // Remove zoom-by-clicking feature set by JXMapKit + mainMap.setBorder(new EmptyBorder(10, 10, 10, 10)); + mainMap.setOverlayPainter(null); + for (MouseListener listener : mainMap.getMouseListeners()) + { + if (listener instanceof CenterMapListener) mainMap.removeMouseListener(listener); } JXMapViewer miniMap = getMiniMap(); - miniMap.setMinimumSize(new Dimension(150, 150)); // Resize to 150px + miniMap.setMinimumSize(new Dimension(150, 150)); miniMap.setPreferredSize(new Dimension(150, 150)); // Configure overlay marker @@ -44,27 +47,32 @@ public GeoMap(Context context) { DefaultWaypoint waypoint = new DefaultWaypoint(); waypoints.add(waypoint); waypointPainter.setWaypoints(waypoints); - try { + try + { waypointPainter.setRenderer(new GeoMapMarker()); - } catch (Exception exception) { + } catch (Exception exception) + { exception.printStackTrace(System.err); } - // Display overlay marker + mainMap.setOverlayPainter(waypointPainter); - // Update location from application state on map click events - mainMap.addMouseListener(new MouseAdapter() { + + mainMap.addMouseListener(new MouseAdapter() + { @Override - public void mouseClicked(MouseEvent event) { + public void mouseClicked(MouseEvent event) + { Point point = event.getPoint(); GeoPosition position = mainMap.convertPointToGeoPosition(point); context.store.setLocation(position); } }); - // Update waypoint on location change events from application state - context.store.addLocationListener(position -> { + + context.store.addLocationListener(position -> + { waypoint.setPosition(position); getMainMap().repaint(); }); From 50f0fdbcda402bcffff1779a6d12a7be5870d1a4 Mon Sep 17 00:00:00 2001 From: lois Date: Wed, 22 May 2024 20:20:41 +0800 Subject: [PATCH 3/7] new tasks given done --- pom.xml | 8 +- src/main/java/edu/project/Context.java | 25 +- .../java/edu/project/components/GeoMap.java | 62 +-- .../java/edu/project/yourpackage/Parse.java | 375 ------------------ .../edu/project/yourpackage/WeatherApi.java | 47 +++ .../yourpackage/WeatherCurrentData.java | 18 + .../yourpackage/WeatherForecast5Data.java | 30 ++ 7 files changed, 156 insertions(+), 409 deletions(-) delete mode 100644 src/main/java/edu/project/yourpackage/Parse.java create mode 100644 src/main/java/edu/project/yourpackage/WeatherApi.java create mode 100644 src/main/java/edu/project/yourpackage/WeatherCurrentData.java create mode 100644 src/main/java/edu/project/yourpackage/WeatherForecast5Data.java diff --git a/pom.xml b/pom.xml index c62264f..aa05db8 100644 --- a/pom.xml +++ b/pom.xml @@ -19,12 +19,16 @@ flatlaf 3.4.1 - com.google.code.gson gson - 2.8.5 + 2.8.8 + + com.google.code.gson + gson + 2.8.5 + diff --git a/src/main/java/edu/project/Context.java b/src/main/java/edu/project/Context.java index 00ae1a4..4961df6 100644 --- a/src/main/java/edu/project/Context.java +++ b/src/main/java/edu/project/Context.java @@ -1,8 +1,25 @@ package edu.project; -/** - * Acts as the service locator for all the services in the project - */ +import edu.project.yourpackage.WeatherApi; +import edu.project.yourpackage.WeatherCurrentData; +import edu.project.yourpackage.WeatherForecast5Data; +import java.io.IOException; // <-- Make sure this import is present +import org.jxmapviewer.viewer.GeoPosition; + public class Context { - public final Store store = new Store(); + public Store store; + private WeatherApi weatherApi; + + public Context() { + this.store = new Store(); + this.weatherApi = new WeatherApi(); + } + + public WeatherCurrentData getCurrentWeather(String city) throws IOException { + return weatherApi.getCurrentWeather(city); + } + + public WeatherForecast5Data getWeatherForecast(String city) throws IOException { + return weatherApi.getWeatherForecast(city); + } } diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index 91247b4..cb814f8 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -5,74 +5,80 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.io.IOException; import java.util.HashSet; - import javax.swing.border.EmptyBorder; - import org.jxmapviewer.JXMapKit; import org.jxmapviewer.JXMapViewer; import org.jxmapviewer.input.CenterMapListener; import org.jxmapviewer.viewer.DefaultWaypoint; import org.jxmapviewer.viewer.GeoPosition; import org.jxmapviewer.viewer.WaypointPainter; - import edu.project.Config; import edu.project.Context; import edu.project.tilesets.HybridTileFactory; +import edu.project.yourpackage.WeatherCurrentData; +import edu.project.yourpackage.WeatherForecast5Data; + +public class GeoMap extends JXMapKit { -public class GeoMap extends JXMapKit -{ - public GeoMap(Context context) - { + private Context context; + private static final int MAP_INIT_ZOOM = 10; + + public GeoMap(Context context) { + this.context = context; setDefaultProvider(DefaultProviders.Custom); setTileFactory(new HybridTileFactory()); JXMapViewer mainMap = getMainMap(); - mainMap.setBorder(new EmptyBorder(10, 10, 10, 10)); - mainMap.setOverlayPainter(null); - for (MouseListener listener : mainMap.getMouseListeners()) - { - + mainMap.setBorder(new EmptyBorder(10, 10, 10, 10)); + mainMap.setOverlayPainter(null); + for (MouseListener listener : mainMap.getMouseListeners()) { if (listener instanceof CenterMapListener) mainMap.removeMouseListener(listener); } JXMapViewer miniMap = getMiniMap(); - miniMap.setMinimumSize(new Dimension(150, 150)); + miniMap.setMinimumSize(new Dimension(150, 150)); miniMap.setPreferredSize(new Dimension(150, 150)); - // Configure overlay marker WaypointPainter waypointPainter = new WaypointPainter(); HashSet waypoints = new HashSet(); DefaultWaypoint waypoint = new DefaultWaypoint(); waypoints.add(waypoint); waypointPainter.setWaypoints(waypoints); - try - { + try { waypointPainter.setRenderer(new GeoMapMarker()); - } catch (Exception exception) - { + } catch (Exception exception) { exception.printStackTrace(System.err); } - mainMap.setOverlayPainter(waypointPainter); - - mainMap.addMouseListener(new MouseAdapter() - { + mainMap.addMouseListener(new MouseAdapter() { @Override - public void mouseClicked(MouseEvent event) - { + public void mouseClicked(MouseEvent event) { Point point = event.getPoint(); GeoPosition position = mainMap.convertPointToGeoPosition(point); context.store.setLocation(position); + + // Fetch weather data for the new location + try { + String city = "Batac,PH"; // You can change this to use actual city name from position + WeatherCurrentData currentData = context.getCurrentWeather(city); + WeatherForecast5Data forecastData = context.getWeatherForecast(city); + + // Update UI with the fetched weather data + System.out.println("City: " + currentData.name); + System.out.println("Temperature: " + (currentData.main.temp - 273.15) + "°C"); + System.out.println("Weather: " + forecastData.list.get(0).weather.get(0).description); + } catch (IOException e) { + e.printStackTrace(); + } } }); - - context.store.addLocationListener(position -> - { + context.store.addLocationListener(position -> { waypoint.setPosition(position); getMainMap().repaint(); }); @@ -80,4 +86,4 @@ public void mouseClicked(MouseEvent event) setCenterPosition(context.store.getLocation()); setZoom(Config.MAP_INIT_ZOOM); } -} +} \ No newline at end of file diff --git a/src/main/java/edu/project/yourpackage/Parse.java b/src/main/java/edu/project/yourpackage/Parse.java deleted file mode 100644 index cc2a859..0000000 --- a/src/main/java/edu/project/yourpackage/Parse.java +++ /dev/null @@ -1,375 +0,0 @@ -package edu.project.yourpackage; - -import com.google.gson.Gson; - -public class Parse - { - private final String cod; - private final double message; - private final int cnt; - private final List[] list; - private final City city; - - public Parse(String cod, double message, int cnt, List[] list, City city) - { - this.cod = cod; - this.message = message; - this.cnt = cnt; - this.list = list; - this.city = city; - } - - public static Parse fromJson(String json) - { - Gson gson = new Gson(); - return gson.fromJson(json, Parse.class); - } - - public String getCod() - { - return cod; - } - - public double getMessage() - { - return message; - } - - public int getCnt() - { - return cnt; - } - - public List[] getList() - { - return list; - } - - public City getCity() - { - return city; - } - - public static class List - { - private final int dt; - private final Main main; - private final Weather[] weather; - private final Clouds clouds; - private final Wind wind; - private final int visibility; - private final double pop; - private final Sys sys; - private final String dt_txt; - - public List(int dt, Main main, Weather[] weather, Clouds clouds, Wind wind, int visibility, double pop, Sys sys, String dt_txt) - { - this.dt = dt; - this.main = main; - this.weather = weather; - this.clouds = clouds; - this.wind = wind; - this.visibility = visibility; - this.pop = pop; - this.sys = sys; - this.dt_txt = dt_txt; - } - - public int getDt() - { - return dt; - } - - public Main getMain() - { - return main; - } - - public Weather[] getWeather() - { - return weather; - } - - public Clouds getClouds() - { - return clouds; - } - - public Wind getWind() - { - return wind; - } - - public int getVisibility() - { - return visibility; - } - - public double getPop() - { - return pop; - } - - public Sys getSys() - { - return sys; - } - - public String getDt_txt() - { - return dt_txt; - } - } - - public static class Main - { - private final double temp; - private final double feels_like; - private final double temp_min; - private final double temp_max; - private final int pressure; - private final int sea_level; - private final int grnd_level; - private final int humidity; - private final double temp_kf; - - public Main(double temp, double feels_like, double temp_min, double temp_max, int pressure, int sea_level, int grnd_level, int humidity, double temp_kf) - { - this.temp = temp; - this.feels_like = feels_like; - this.temp_min = temp_min; - this.temp_max = temp_max; - this.pressure = pressure; - this.sea_level = sea_level; - this.grnd_level = grnd_level; - this.humidity = humidity; - this.temp_kf = temp_kf; - } - - public double getTemp() - { - return temp; - } - - public double getFeels_like() - { - return feels_like; - } - - public double getTemp_min() - { - return temp_min; - } - - public double getTemp_max() - { - return temp_max; - } - - public int getPressure() - { - return pressure; - } - - public int getSea_level() - { - return sea_level; - } - - public int getGrnd_level() - { - return grnd_level; - } - - public int getHumidity() - { - return humidity; - } - - public double getTemp_kf() - { - return temp_kf; - } - } - - public static class Weather - { - private final int id; - private final String main; - private final String description; - private final String icon; - - public Weather(int id, String main, String description, String icon) - { - this.id = id; - this.main = main; - this.description = description; - this.icon = icon; - } - - public int getId() - { - return id; - } - - public String getMain() - { - return main; - } - - public String getDescription() - { - return description; - } - - public String getIcon() - { - return icon; - } - } - - public static class Clouds - { - private final int all; - - public Clouds(int all) - { - this.all = all; - } - - public int getAll() - { - return all; - } - } - - public static class Wind - { - private final double speed; - private final int deg; - private final double gust; - - public Wind(double speed, int deg, double gust) - { - this.speed = speed; - this.deg = deg; - this.gust = gust; - } - - public double getSpeed() - { - return speed; - } - - public int getDeg() - { - return deg; - } - - public double getGust() - { - return gust; - } - } - - public static class Sys - { - private final String pod; - - public Sys(String pod) - { - this.pod = pod; - } - - public String getPod() - { - return pod; - } - } - - public static class City - { - private final int id; - private final String name; - private final Coord coord; - private final String country; - private final int population; - private final int timezone; - private final long sunrise; - private final long sunset; - - public City(int id, String name, Coord coord, String country, int population, int timezone, long sunrise, long sunset) - { - this.id = id; - this.name = name; - this.coord = coord; - this.country = country; - this.population = population; - this.timezone = timezone; - this.sunrise = sunrise; - this.sunset = sunset; - } - - public int getId() - { - return id; - } - - public String getName() - { - return name; - } - - public Coord getCoord() - { - return coord; - } - - public String getCountry() - { - return country; - } - - public int getPopulation() - { - return population; - } - - public int getTimezone() - { - return timezone; - } - - public long getSunrise() - { - return sunrise; - } - - public long getSunset() - { - return sunset; - } - } - - public static class Coord - { - private final double lat; - private final double lon; - - public Coord(double lat, double lon) - { - this.lat = lat; - this.lon = lon; - } - - public double getLat() - { - return lat; - } - - public double getLon() - { - return lon; - } - } -} diff --git a/src/main/java/edu/project/yourpackage/WeatherApi.java b/src/main/java/edu/project/yourpackage/WeatherApi.java new file mode 100644 index 0000000..b7161b5 --- /dev/null +++ b/src/main/java/edu/project/yourpackage/WeatherApi.java @@ -0,0 +1,47 @@ +//API key: 23c541de6a2105ebf03f39791a6b7cd1 +package edu.project.yourpackage; + +import com.google.gson.Gson; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class WeatherApi { + private static final String API_KEY = "23c541de6a2105ebf03f39791a6b7cd1"; + private static final String CURRENT_WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"; + private static final String FORECAST_WEATHER_URL = "http://api.openweathermap.org/data/2.5/forecast"; + + public WeatherCurrentData getCurrentWeather(String city) throws IOException { + String urlString = CURRENT_WEATHER_URL + "?q=" + city + "&appid=" + API_KEY; + return fetchWeatherData(urlString, WeatherCurrentData.class); + + } + + public WeatherForecast5Data getWeatherForecast(String city) throws IOException{ + String urlString = FORECAST_WEATHER_URL + "?q=" + city + "&appid=" + API_KEY; + return fetchWeatherData(urlString, WeatherForecast5Data.class); + + } + + private T fetchWeatherData(String urlString, Class clazz) throws IOException { + URL url = new URL(urlString); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + StringBuilder content; + try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + String inputLine; + content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + } + + conn.disconnect(); + + Gson gson = new Gson(); + return gson.fromJson(content.toString(), clazz); + } +} diff --git a/src/main/java/edu/project/yourpackage/WeatherCurrentData.java b/src/main/java/edu/project/yourpackage/WeatherCurrentData.java new file mode 100644 index 0000000..646feef --- /dev/null +++ b/src/main/java/edu/project/yourpackage/WeatherCurrentData.java @@ -0,0 +1,18 @@ +package edu.project.yourpackage; + +public class WeatherCurrentData { + public String name; + public Main main; + public Wind wind; + + public static class Main { + public float temp; + public float pressure; + public int humidity; + } + + public static class Wind { + public float speed; + public int deg; + } +} diff --git a/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java b/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java new file mode 100644 index 0000000..3b7eab3 --- /dev/null +++ b/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java @@ -0,0 +1,30 @@ +package edu.project.yourpackage; + +import java.util.List; + +public class WeatherForecast5Data { + public List list; + + public static class WeatherList { + public Main main; + public List weather; + public Wind wind; + public String dt_txt; + + public static class Main { + public float temp; + public float pressure; + public int humidity; + } + + public static class Weather { + public String description; + public String icon; + } + + public static class Wind { + public float speed; + public int deg; + } + } +} From 9b88ce4032cbc1d464f68b638b65a7d515529168 Mon Sep 17 00:00:00 2001 From: lois Date: Tue, 28 May 2024 15:39:00 +0800 Subject: [PATCH 4/7] remove duplicate gson dependency --- pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index aa05db8..0be092b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 project @@ -24,11 +23,6 @@ gson 2.8.8 - - com.google.code.gson - gson - 2.8.5 - From 636d747c72329abecbb040aeb50bdd0ec5b720af Mon Sep 17 00:00:00 2001 From: lois Date: Tue, 28 May 2024 15:42:17 +0800 Subject: [PATCH 5/7] refactor weather fetching code --- src/main/java/edu/project/Config.java | 2 + src/main/java/edu/project/Context.java | 29 +++------ src/main/java/edu/project/Main.java | 7 ++- src/main/java/edu/project/Store.java | 61 ++++++++++++++++--- src/main/java/edu/project/api/WeatherApi.java | 59 ++++++++++++++++++ .../edu/project/api/WeatherCurrentData.java | 45 ++++++++++++++ .../edu/project/api/WeatherForecast5Data.java | 30 +++++++++ .../java/edu/project/components/GeoMap.java | 37 ++++------- .../edu/project/components/GeoMapMarker.java | 18 ++---- .../edu/project/services/WeatherService.java | 24 ++++++++ .../edu/project/yourpackage/WeatherApi.java | 47 -------------- .../yourpackage/WeatherCurrentData.java | 18 ------ .../yourpackage/WeatherForecast5Data.java | 30 --------- 13 files changed, 241 insertions(+), 166 deletions(-) create mode 100644 src/main/java/edu/project/api/WeatherApi.java create mode 100644 src/main/java/edu/project/api/WeatherCurrentData.java create mode 100644 src/main/java/edu/project/api/WeatherForecast5Data.java create mode 100644 src/main/java/edu/project/services/WeatherService.java delete mode 100644 src/main/java/edu/project/yourpackage/WeatherApi.java delete mode 100644 src/main/java/edu/project/yourpackage/WeatherCurrentData.java delete mode 100644 src/main/java/edu/project/yourpackage/WeatherForecast5Data.java diff --git a/src/main/java/edu/project/Config.java b/src/main/java/edu/project/Config.java index 92e4748..52c8fb3 100644 --- a/src/main/java/edu/project/Config.java +++ b/src/main/java/edu/project/Config.java @@ -5,6 +5,8 @@ * location */ public class Config { + public static final String OPENWEATHERMAP_API_KEY = "23c541de6a2105ebf03f39791a6b7cd1"; + public static final int WINDOW_INIT_WIDTH = 800; public static final int WINDOW_INIT_HEIGHT = 600; diff --git a/src/main/java/edu/project/Context.java b/src/main/java/edu/project/Context.java index 4961df6..5eb655d 100644 --- a/src/main/java/edu/project/Context.java +++ b/src/main/java/edu/project/Context.java @@ -1,25 +1,16 @@ package edu.project; -import edu.project.yourpackage.WeatherApi; -import edu.project.yourpackage.WeatherCurrentData; -import edu.project.yourpackage.WeatherForecast5Data; -import java.io.IOException; // <-- Make sure this import is present -import org.jxmapviewer.viewer.GeoPosition; +import edu.project.api.WeatherApi; +/** + * Acts as the service locator for all the services in the project + */ public class Context { - public Store store; - private WeatherApi weatherApi; + public final Store store; + public final WeatherApi weatherApi; - public Context() { - this.store = new Store(); - this.weatherApi = new WeatherApi(); - } - - public WeatherCurrentData getCurrentWeather(String city) throws IOException { - return weatherApi.getCurrentWeather(city); - } - - public WeatherForecast5Data getWeatherForecast(String city) throws IOException { - return weatherApi.getWeatherForecast(city); - } + public Context() { + this.store = new Store(); + this.weatherApi = new WeatherApi(); + } } diff --git a/src/main/java/edu/project/Main.java b/src/main/java/edu/project/Main.java index 475d87a..77b021a 100644 --- a/src/main/java/edu/project/Main.java +++ b/src/main/java/edu/project/Main.java @@ -1,10 +1,9 @@ package edu.project; import javax.swing.SwingUtilities; - import com.formdev.flatlaf.themes.FlatMacLightLaf; - import edu.project.components.App; +import edu.project.services.WeatherService; public class Main { public static void main(String[] args) { @@ -12,8 +11,10 @@ public static void main(String[] args) { FlatMacLightLaf.setup(); Context context = new Context(); + new WeatherService(context); + App app = new App(context); app.setVisible(true); }); } -} \ No newline at end of file +} diff --git a/src/main/java/edu/project/Store.java b/src/main/java/edu/project/Store.java index 97ab741..6335f8b 100644 --- a/src/main/java/edu/project/Store.java +++ b/src/main/java/edu/project/Store.java @@ -3,23 +3,18 @@ import java.util.ArrayList; import java.util.Objects; import java.util.function.Consumer; - import javax.swing.SwingUtilities; - import org.jxmapviewer.viewer.GeoPosition; -/** - * Acts as the container for the application state and provides a - * reactive interface for notifying any listeners (e.g. UI components) for any - * changes. - */ -public class Store { +import edu.project.api.WeatherCurrentData; +import edu.project.api.WeatherForecast5Data; +public class Store { public Store() { setLocation(new GeoPosition(Config.MAP_INIT_LAT, Config.MAP_INIT_LON)); } - /* Location */ + /* location */ private GeoPosition location = new GeoPosition(0, 0); @@ -42,4 +37,52 @@ public void setLocation(GeoPosition position) { public void addLocationListener(Consumer listener) { locationListeners.add(listener); } + + /* weather current data */ + + private WeatherCurrentData weatherCurrentData; + + public WeatherCurrentData getWeatherCurrentData() { + return weatherCurrentData; + } + + public void setWeatherCurrentData(WeatherCurrentData data) { + if (Objects.equals(weatherCurrentData, data)) + return; + + weatherCurrentData = data; + SwingUtilities.invokeLater(() -> { + weatherCurrentDataListeners.forEach(listener -> listener.accept(data)); + }); + } + + private ArrayList> weatherCurrentDataListeners = new ArrayList<>(); + + public void addWeatherCurrentDataListener(Consumer listener) { + weatherCurrentDataListeners.add(listener); + } + + /* weather forecast data */ + + private WeatherForecast5Data weatherForecast5Data; + + public WeatherForecast5Data getWeatherForecast5Data() { + return weatherForecast5Data; + } + + public void setWeatherForecast5Data(WeatherForecast5Data data) { + if (Objects.equals(weatherForecast5Data, data)) + return; + + weatherForecast5Data = data; + SwingUtilities.invokeLater(() -> { + weatherForecast5DataListeners.forEach(listener -> listener.accept(data)); + }); + } + + private ArrayList> weatherForecast5DataListeners = new ArrayList<>(); + + public void addWeatherForecast5DataListener(Consumer listener) { + weatherForecast5DataListeners.add(listener); + } } diff --git a/src/main/java/edu/project/api/WeatherApi.java b/src/main/java/edu/project/api/WeatherApi.java new file mode 100644 index 0000000..35621a3 --- /dev/null +++ b/src/main/java/edu/project/api/WeatherApi.java @@ -0,0 +1,59 @@ +package edu.project.api; + +import com.google.gson.Gson; + +import edu.project.Config; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class WeatherApi { + private static final String CURRENT_WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"; + private static final String FORECAST_WEATHER_URL = "http://api.openweathermap.org/data/2.5/forecast"; + + public WeatherCurrentData getCurrentWeather(String city) throws IOException { + String urlString = CURRENT_WEATHER_URL + "?q=" + city + "&appid=" + Config.OPENWEATHERMAP_API_KEY; + return fetchWeatherData(urlString, WeatherCurrentData.class); + } + + public WeatherForecast5Data getWeatherForecast(String city) throws IOException { + String urlString = FORECAST_WEATHER_URL + "?q=" + city + "&appid=" + Config.OPENWEATHERMAP_API_KEY; + return fetchWeatherData(urlString, WeatherForecast5Data.class); + } + + public WeatherCurrentData getCurrentWeather(double lat, double lon) throws IOException { + String urlString = CURRENT_WEATHER_URL + "?lat=" + lat + "&lon=" + lon + "&appid=" + + Config.OPENWEATHERMAP_API_KEY; + return fetchWeatherData(urlString, WeatherCurrentData.class); + } + + public WeatherForecast5Data getWeatherForecast(double lat, double lon) throws IOException { + String urlString = FORECAST_WEATHER_URL + "?lat=" + lat + "&lon=" + lon + "&appid=" + + Config.OPENWEATHERMAP_API_KEY; + return fetchWeatherData(urlString, WeatherForecast5Data.class); + } + + private T fetchWeatherData(String urlString, Class clazz) throws IOException { + URL url = new URL(urlString); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + StringBuilder content; + try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + String inputLine; + content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + } + + conn.disconnect(); + + String json = content.toString(); + Gson gson = new Gson(); + return gson.fromJson(json, clazz); + } +} diff --git a/src/main/java/edu/project/api/WeatherCurrentData.java b/src/main/java/edu/project/api/WeatherCurrentData.java new file mode 100644 index 0000000..9e71431 --- /dev/null +++ b/src/main/java/edu/project/api/WeatherCurrentData.java @@ -0,0 +1,45 @@ +package edu.project.api; + +import com.google.gson.annotations.SerializedName; + +public class WeatherCurrentData { + public String name; + public Main main; + public Wind wind; + public Clouds clouds; + public Rain rain; + public Sys sys; + public int visibility; + public long dt; + + public static class Main { + public float temp; + public float feels_like; + public float temp_min; + public float temp_max; + public float pressure; + public int humidity; + public float sea_level; + public float grnd_level; + } + + public static class Wind { + public float speed; + public int deg; + public float gust; + } + + public static class Clouds { + public int all; + } + + public static class Rain { + @SerializedName("1h") + public float one_hour; + } + + public static class Sys { + public long sunrise; + public long sunset; + } +} diff --git a/src/main/java/edu/project/api/WeatherForecast5Data.java b/src/main/java/edu/project/api/WeatherForecast5Data.java new file mode 100644 index 0000000..b882cd1 --- /dev/null +++ b/src/main/java/edu/project/api/WeatherForecast5Data.java @@ -0,0 +1,30 @@ +package edu.project.api; + +import java.util.List; + +public class WeatherForecast5Data { + public List list; + + public static class WeatherList { + public Main main; + public List weather; + public Wind wind; + public String dt_txt; + + public static class Main { + public float temp; + public float pressure; + public int humidity; + } + + public static class Weather { + public String description; + public String icon; + } + + public static class Wind { + public float speed; + public int deg; + } + } +} diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index cb814f8..86f7faa 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -8,49 +8,48 @@ import java.io.IOException; import java.util.HashSet; import javax.swing.border.EmptyBorder; + import org.jxmapviewer.JXMapKit; import org.jxmapviewer.JXMapViewer; import org.jxmapviewer.input.CenterMapListener; import org.jxmapviewer.viewer.DefaultWaypoint; import org.jxmapviewer.viewer.GeoPosition; import org.jxmapviewer.viewer.WaypointPainter; + import edu.project.Config; import edu.project.Context; import edu.project.tilesets.HybridTileFactory; -import edu.project.yourpackage.WeatherCurrentData; -import edu.project.yourpackage.WeatherForecast5Data; public class GeoMap extends JXMapKit { - private Context context; - private static final int MAP_INIT_ZOOM = 10; - public GeoMap(Context context) { - this.context = context; setDefaultProvider(DefaultProviders.Custom); setTileFactory(new HybridTileFactory()); JXMapViewer mainMap = getMainMap(); mainMap.setBorder(new EmptyBorder(10, 10, 10, 10)); mainMap.setOverlayPainter(null); + for (MouseListener listener : mainMap.getMouseListeners()) { - if (listener instanceof CenterMapListener) + if (listener instanceof CenterMapListener) { mainMap.removeMouseListener(listener); + } } JXMapViewer miniMap = getMiniMap(); miniMap.setMinimumSize(new Dimension(150, 150)); miniMap.setPreferredSize(new Dimension(150, 150)); - WaypointPainter waypointPainter = new WaypointPainter(); - HashSet waypoints = new HashSet(); + WaypointPainter waypointPainter = new WaypointPainter<>(); + HashSet waypoints = new HashSet<>(); DefaultWaypoint waypoint = new DefaultWaypoint(); waypoints.add(waypoint); waypointPainter.setWaypoints(waypoints); + try { waypointPainter.setRenderer(new GeoMapMarker()); - } catch (Exception exception) { - exception.printStackTrace(System.err); + } catch (IOException e) { + e.printStackTrace(); } mainMap.setOverlayPainter(waypointPainter); @@ -61,20 +60,6 @@ public void mouseClicked(MouseEvent event) { Point point = event.getPoint(); GeoPosition position = mainMap.convertPointToGeoPosition(point); context.store.setLocation(position); - - // Fetch weather data for the new location - try { - String city = "Batac,PH"; // You can change this to use actual city name from position - WeatherCurrentData currentData = context.getCurrentWeather(city); - WeatherForecast5Data forecastData = context.getWeatherForecast(city); - - // Update UI with the fetched weather data - System.out.println("City: " + currentData.name); - System.out.println("Temperature: " + (currentData.main.temp - 273.15) + "°C"); - System.out.println("Weather: " + forecastData.list.get(0).weather.get(0).description); - } catch (IOException e) { - e.printStackTrace(); - } } }); @@ -86,4 +71,4 @@ public void mouseClicked(MouseEvent event) { setCenterPosition(context.store.getLocation()); setZoom(Config.MAP_INIT_ZOOM); } -} \ No newline at end of file +} diff --git a/src/main/java/edu/project/components/GeoMapMarker.java b/src/main/java/edu/project/components/GeoMapMarker.java index 586fe56..8a64b88 100644 --- a/src/main/java/edu/project/components/GeoMapMarker.java +++ b/src/main/java/edu/project/components/GeoMapMarker.java @@ -4,9 +4,7 @@ import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import java.io.IOException; - import javax.imageio.ImageIO; - import org.jxmapviewer.JXMapViewer; import org.jxmapviewer.viewer.DefaultWaypoint; import org.jxmapviewer.viewer.WaypointRenderer; @@ -26,19 +24,11 @@ public void paintWaypoint(Graphics2D graphics, JXMapViewer map, DefaultWaypoint graphics = (Graphics2D) graphics.create(); Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom()); - graphics.drawImage( - markerShadowImage, - (int) point.getX() - 12, - (int) point.getY() - markerShadowImage.getHeight(), - null); - - graphics.drawImage( - markerIconImage, - (int) point.getX() - markerIconImage.getWidth() / 2, - (int) point.getY() - markerIconImage.getHeight(), - null); + graphics.drawImage(markerShadowImage, (int) point.getX() - 12, + (int) point.getY() - markerShadowImage.getHeight(), null); + graphics.drawImage(markerIconImage, (int) point.getX() - markerIconImage.getWidth() / 2, + (int) point.getY() - markerIconImage.getHeight(), null); graphics.dispose(); } - } diff --git a/src/main/java/edu/project/services/WeatherService.java b/src/main/java/edu/project/services/WeatherService.java new file mode 100644 index 0000000..a922d32 --- /dev/null +++ b/src/main/java/edu/project/services/WeatherService.java @@ -0,0 +1,24 @@ +package edu.project.services; + +import edu.project.Context; +import edu.project.api.WeatherCurrentData; +import edu.project.api.WeatherForecast5Data; + +public class WeatherService { + public WeatherService(Context context) { + context.store.addLocationListener(position -> { + try { + double lat = position.getLatitude(); + double lon = position.getLongitude(); + + WeatherCurrentData currentData = context.weatherApi.getCurrentWeather(lat, lon); + WeatherForecast5Data forecastData = context.weatherApi.getWeatherForecast(lat, lon); + + context.store.setWeatherCurrentData(currentData); + context.store.setWeatherForecast5Data(forecastData); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } +} diff --git a/src/main/java/edu/project/yourpackage/WeatherApi.java b/src/main/java/edu/project/yourpackage/WeatherApi.java deleted file mode 100644 index b7161b5..0000000 --- a/src/main/java/edu/project/yourpackage/WeatherApi.java +++ /dev/null @@ -1,47 +0,0 @@ -//API key: 23c541de6a2105ebf03f39791a6b7cd1 -package edu.project.yourpackage; - -import com.google.gson.Gson; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; - -public class WeatherApi { - private static final String API_KEY = "23c541de6a2105ebf03f39791a6b7cd1"; - private static final String CURRENT_WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather"; - private static final String FORECAST_WEATHER_URL = "http://api.openweathermap.org/data/2.5/forecast"; - - public WeatherCurrentData getCurrentWeather(String city) throws IOException { - String urlString = CURRENT_WEATHER_URL + "?q=" + city + "&appid=" + API_KEY; - return fetchWeatherData(urlString, WeatherCurrentData.class); - - } - - public WeatherForecast5Data getWeatherForecast(String city) throws IOException{ - String urlString = FORECAST_WEATHER_URL + "?q=" + city + "&appid=" + API_KEY; - return fetchWeatherData(urlString, WeatherForecast5Data.class); - - } - - private T fetchWeatherData(String urlString, Class clazz) throws IOException { - URL url = new URL(urlString); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - - StringBuilder content; - try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { - String inputLine; - content = new StringBuilder(); - while ((inputLine = in.readLine()) != null) { - content.append(inputLine); - } - } - - conn.disconnect(); - - Gson gson = new Gson(); - return gson.fromJson(content.toString(), clazz); - } -} diff --git a/src/main/java/edu/project/yourpackage/WeatherCurrentData.java b/src/main/java/edu/project/yourpackage/WeatherCurrentData.java deleted file mode 100644 index 646feef..0000000 --- a/src/main/java/edu/project/yourpackage/WeatherCurrentData.java +++ /dev/null @@ -1,18 +0,0 @@ -package edu.project.yourpackage; - -public class WeatherCurrentData { - public String name; - public Main main; - public Wind wind; - - public static class Main { - public float temp; - public float pressure; - public int humidity; - } - - public static class Wind { - public float speed; - public int deg; - } -} diff --git a/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java b/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java deleted file mode 100644 index 3b7eab3..0000000 --- a/src/main/java/edu/project/yourpackage/WeatherForecast5Data.java +++ /dev/null @@ -1,30 +0,0 @@ -package edu.project.yourpackage; - -import java.util.List; - -public class WeatherForecast5Data { - public List list; - - public static class WeatherList { - public Main main; - public List weather; - public Wind wind; - public String dt_txt; - - public static class Main { - public float temp; - public float pressure; - public int humidity; - } - - public static class Weather { - public String description; - public String icon; - } - - public static class Wind { - public float speed; - public int deg; - } - } -} From 86adfc85d7036a568b406e5c97cb432636652c25 Mon Sep 17 00:00:00 2001 From: lois Date: Tue, 28 May 2024 15:50:06 +0800 Subject: [PATCH 6/7] import missing IOException in geomap --- src/main/java/edu/project/components/GeoMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index 9f337d8..e2bf9e8 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -4,7 +4,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelListener; - +import java.io.IOException; import java.util.HashSet; import javax.swing.event.MouseInputListener; From 4cd2ef104589f4279c1d46eef21450437d1134fc Mon Sep 17 00:00:00 2001 From: lois Date: Tue, 28 May 2024 15:54:05 +0800 Subject: [PATCH 7/7] hello --- .../edu/project/api/WeatherCurrentData.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/edu/project/api/WeatherCurrentData.java b/src/main/java/edu/project/api/WeatherCurrentData.java index 9e71431..2577e7b 100644 --- a/src/main/java/edu/project/api/WeatherCurrentData.java +++ b/src/main/java/edu/project/api/WeatherCurrentData.java @@ -3,43 +3,43 @@ import com.google.gson.annotations.SerializedName; public class WeatherCurrentData { - public String name; - public Main main; - public Wind wind; - public Clouds clouds; - public Rain rain; - public Sys sys; - public int visibility; - public long dt; + public String name; + public Main main; + public Wind wind; + public Clouds clouds; + public Rain rain; + public Sys sys; + public int visibility; + public long dt; - public static class Main { - public float temp; - public float feels_like; - public float temp_min; - public float temp_max; - public float pressure; - public int humidity; - public float sea_level; - public float grnd_level; - } + public static class Main { + public float temp; + public float feels_like; + public float temp_min; + public float temp_max; + public float pressure; + public int humidity; + public float sea_level; + public float grnd_level; + } - public static class Wind { - public float speed; - public int deg; - public float gust; - } + public static class Wind { + public float speed; + public int deg; + public float gust; + } - public static class Clouds { - public int all; - } + public static class Clouds { + public int all; + } - public static class Rain { - @SerializedName("1h") - public float one_hour; - } + public static class Rain { + @SerializedName("1h") + public float one_hour; + } - public static class Sys { - public long sunrise; - public long sunset; - } + public static class Sys { + public long sunrise; + public long sunset; + } }