<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Przyszły Programista - Java</title>
<link>http://forum.przyszlyprogramista.pl/?qa=questions/java</link>
<description>Powered by Question2Answer</description>
<item>
<title>Testowanie WeatherApp - testowanie serwisu</title>
<link>http://forum.przyszlyprogramista.pl/?qa=2125/testowanie-weatherapp-testowanie-serwisu</link>
<description>&lt;p&gt;Cześć wszystkim!&lt;/p&gt;

&lt;p&gt;mam problem z testem aplikacji pogodowej. Mam 2 klasy: GetLocationService i GetLocationClient.&lt;br&gt;
GetLocationClient to klasa która konkretnie wysyła zapytanie do API i zwraca odpowiedź - jej nie chcę testować.&lt;br&gt;
GetLocationService.ma GetLocationClient jako pole i wywołuje go żeby za jego pomocą wysłać zapytanie:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public class GetLocationService extends Service&amp;lt;Location&amp;gt; {

    private final GetLocationAPIClient getLocationAPIClient;

    GetLocationService(GetLocationAPIClient getLocationAPIClient) {
        this.getLocationAPIClient = getLocationAPIClient;
    }

    @Override
    protected Task&amp;lt;Location&amp;gt; createTask() {
        return new Task&amp;lt;Location&amp;gt;() {
            @Override
            protected Location call() throws Exception {

                return getLocationAPIClient.getLocation();
            }
        };
    }
}&lt;/pre&gt;

&lt;p&gt;Chcę zamockować działanie&amp;nbsp;GetLocationClient i przetestować, czy&amp;nbsp;GetLocationService poprawnie przekazuje odpowiedź lub zgodnie z założeniem wyrzuca błąd.&lt;/p&gt;

&lt;p&gt;Alej jak przetestować createTask()? Czy ktoś testował Service?&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=2125/testowanie-weatherapp-testowanie-serwisu</guid>
<pubDate>Tue, 02 Jun 2026 18:35:43 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa -&gt; javafx-maven-plugin</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1808/aplikacja-pogodowa-javafx-maven-plugin</link>
<description>&lt;p&gt;Cześć,&lt;/p&gt;

&lt;p&gt;po dwóch dniach walki zwracam się do was o pomoc w rozwiązaniu problemu.&lt;/p&gt;

&lt;p&gt;Problem: Aplikacja nie chce uruchomić się. Miało to być pierwsze odpalenie ale nie udało się.&amp;nbsp;Ani poprzez &quot;Run&quot; ani poprzez &quot;mvn javafx:run&quot;.&lt;/p&gt;

&lt;p&gt;Do czego doszedłem:&lt;/p&gt;

&lt;p&gt;1) Najważniejsze pliki projektu&lt;/p&gt;

&lt;p&gt;pom.xml&lt;/p&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

  &amp;lt;groupId&amp;gt;com.weather&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;WeatherApp&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;

  &amp;lt;name&amp;gt;WeatherApp&amp;lt;/name&amp;gt;
  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;

  &amp;lt;properties&amp;gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt;
    &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt;
    &amp;lt;javafx.version&amp;gt;11.0.2&amp;lt;/javafx.version&amp;gt;
  &amp;lt;/properties&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;0.0.8&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-graphics&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-web&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.9.0&amp;lt;/version&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;release&amp;gt;11&amp;lt;/release&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;0.0.8&amp;lt;/version&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;mainClass&amp;gt;com.weather.App&amp;lt;/mainClass&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
    &amp;lt;defaultGoal&amp;gt;install&amp;lt;/defaultGoal&amp;gt;
  &amp;lt;/build&amp;gt;

&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;App:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package com.weather;

import com.weather.view.ViewFactory;
import javafx.application.Application;
import javafx.stage.Stage;

public class App extends Application
{
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        ViewFactory viewFactory = new ViewFactory();
        viewFactory.showMainWindow(stage);
    }
}&lt;/pre&gt;

&lt;p&gt;ViewFactory:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package com.weather.view;

import com.weather.App;
import com.weather.controller.FxmlDefinedController;
import com.weather.controller.MainViewController;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import java.io.IOException;

public class ViewFactory {
    private static final BorderPane MAIN_VIEW = (BorderPane) loadFXML(new MainViewController(&quot;MainView&quot;));
    private static final Scene SCENE = new Scene(MAIN_VIEW);

    public static Parent loadFXML(FxmlDefinedController controller) {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(&quot;view/fxml/&quot; + controller.getFxmlName() + &quot;.fxml&quot;));
        fxmlLoader.setController(controller);
        try {
            return fxmlLoader.load();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(&quot;Error with loadFXML function!&quot;);
            return null;
        }
    }

    public static void showMainWindow(Stage primaryStage) {
        primaryStage.setScene(SCENE);
        primaryStage.setMaximized(false);
        primaryStage.show();
    }
}&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;2) Struktura projektu oraz widok z Plugins&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://i.ibb.co/vVVjBrx/maven.png&quot; style=&quot;height:255px; width:400px&quot;&gt;&lt;/p&gt;

&lt;p&gt;3) Zmienne środowiskowe&lt;/p&gt;

&lt;p&gt;JAVA_HOME&amp;nbsp;C:\Program Files\Java\jdk-11.0.21 -&amp;gt; podpięte do path&lt;/p&gt;

&lt;p&gt;MAVEN_HOME&amp;nbsp;C:\Program Files\apache-maven-3.9.6 -&amp;gt; podpięte w path&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Ciąg dalszy mojej diagnostyki w pliku ponieważ są ograniczenia znaków:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1ueleysLRNlVVSie-2NNZntbFqw6E0_14/edit?usp=sharing&amp;amp;ouid=104257406841112782834&amp;amp;rtpof=true&amp;amp;sd=true&quot; rel=&quot;nofollow&quot;&gt;https://docs.google.com/document/d/1ueleysLRNlVVSie-2NNZntbFqw6E0_14/edit?usp=sharing&amp;amp;ouid=104257406841112782834&amp;amp;rtpof=true&amp;amp;sd=true&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Już brak mi pomysłu. Liczę na waszą pomoc. Z góry dzięki&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;EDIT: Zrobiłem mały krok do przdu, ale trochę oszukany. Dodałem z ciekawości plik module-info.java i runtime odpalił. Teraz jak to zrobić aby było porządnie?&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1808/aplikacja-pogodowa-javafx-maven-plugin</guid>
<pubDate>Thu, 11 Jan 2024 18:53:12 +0000</pubDate>
</item>
<item>
<title>No main manifest attribute</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1798/no-main-manifest-attribute</link>
<description>&lt;p&gt;Hej :)&lt;/p&gt;

&lt;p&gt;Po wywołaniu w terminalu mvn javafx:run&amp;nbsp;&lt;/p&gt;

&lt;p&gt;pojawia mi się error w postaci :&lt;/p&gt;

&lt;p&gt;No plugin found for prefix 'javax' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the reposit&lt;br&gt;
ories [local (C:\Users\Dell\.m2\repository), central (&lt;a rel=&quot;nofollow&quot; href=&quot;https://repo.maven.apache.org/maven2&quot; target=&quot;_blank&quot;&gt;https://repo.maven.apache.org/maven2&lt;/a&gt;)]&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Natomiast, gdy utworzyłam plik jar i próbuje go uruchomić wystwietla mi :&lt;/p&gt;

&lt;p&gt;no main manifest attribute, in &quot;sciezka pliku&quot;&lt;/p&gt;

&lt;p&gt;Moj plik POM wyglada:&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;WeatherApp_Javafx&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;WeatherApp_Javafx&amp;lt;/name&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
        &amp;lt;junit.version&amp;gt;5.9.2&amp;lt;/junit.version&amp;gt;
        &amp;lt;javax.version&amp;gt;21.0.1&amp;lt;/javax.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javax.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javax.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-web&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javax.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-media&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javax.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.controlsfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;controlsfx&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;11.1.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.junit.jupiter&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit-jupiter-api&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${junit.version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.junit.jupiter&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;junit-jupiter-engine&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${junit.version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.10.1&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;6.1.1&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.10.1&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;source&amp;gt;9&amp;lt;/source&amp;gt;
                    &amp;lt;target&amp;gt;9&amp;lt;/target&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;0.0.8&amp;lt;/version&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;default-cli&amp;lt;/id&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;mainClass&amp;gt;com.example.weatherapp_javafx/com.example.weatherapp_javafx.Launcher
                            &amp;lt;/mainClass&amp;gt;
                            &amp;lt;launcher&amp;gt;app&amp;lt;/launcher&amp;gt;
                            &amp;lt;jlinkZipName&amp;gt;app&amp;lt;/jlinkZipName&amp;gt;
                            &amp;lt;jlinkImageName&amp;gt;app&amp;lt;/jlinkImageName&amp;gt;
                            &amp;lt;noManPages&amp;gt;true&amp;lt;/noManPages&amp;gt;
                            &amp;lt;stripDebug&amp;gt;true&amp;lt;/stripDebug&amp;gt;
                            &amp;lt;noHeaderFiles&amp;gt;true&amp;lt;/noHeaderFiles&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;Natomiast Manifest wyglada tak :&lt;/p&gt;

&lt;p&gt;Manifest-Version: 1.0&lt;br&gt;
Created-By: Maven JAR Plugin 3.3.0&lt;br&gt;
Build-Jdk-Spec: 21&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Nie wiem jak to ugryźć. Czy któś miał podobny problem ?&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1798/no-main-manifest-attribute</guid>
<pubDate>Wed, 27 Dec 2023 13:39:52 +0000</pubDate>
</item>
<item>
<title>Aplikacja mailowa</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1796/aplikacja-mailowa</link>
<description>&lt;p&gt;Cześć,&lt;/p&gt;

&lt;p&gt;Mam problem ze zrobieniem aplikacji mailowej z kursu Udemy (7 sekcja w kursie). Logowanie następuje poprawnie, wczytanie maili również, ale po tym żadne zmiany w aplikacji nie przechodzą na skrzynkę, ani nowe maile ze skrzynki nie pojawiają się w aplikacji. Kod już praktycznie jest identyczny z tym, który ma prowadzący i nie wyskakują żadne błędy.&amp;nbsp;Jaka może być tego przyczyna?&lt;/p&gt;

&lt;p&gt;Używam maila o2 z protokołem pop3, a mój dotychczasowy kod jest tutaj:&amp;nbsp;&lt;a href=&quot;https://github.com/napioooor/Email-Client&quot; rel=&quot;nofollow&quot;&gt;https://github.com/napioooor/Email-Client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;span id=&quot;__symantecMPKIClientDetector&quot; style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;span style=&quot;display:none&quot;&gt;__PRESENT&lt;/span&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1796/aplikacja-mailowa</guid>
<pubDate>Sat, 09 Dec 2023 23:21:44 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1740/aplikacja-pogodowa</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Mam problem z aplikacją pogodową.&lt;br /&gt;
&lt;br /&gt;
Drugie miasto mogę zmieniać bez problemu.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Natomiast jak zmieniam pierwsze to mi niestety wyskakują błędy:&lt;br /&gt;
&lt;br /&gt;
Caused by: net.aksingh.owmjapis.api.APIException: API call gave error: 400 - Bad Request&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at owm.japis@2.5.3.0/net.aksingh.owmjapis.core.OWM.hourlyWeatherForecastByCityName(OWM.kt:331)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at WeatherApp/com.dariuszkrygier.model.WeatherForecastFetcher.getWeatherForecast(WeatherForecastFetcher.java:16)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at WeatherApp/com.dariuszkrygier.controller.MainWindowController.showCurrentWeather(MainWindowController.java:285)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at WeatherApp/com.dariuszkrygier.controller.MainWindowController.changeFirstCityLocationButtonAction(MainWindowController.java:202)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... 58 more&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Podam więcej szczegółów jeśli ktoś będzie zainteresowany pomóc mi :)</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1740/aplikacja-pogodowa</guid>
<pubDate>Wed, 26 Jul 2023 14:26:46 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1108/aplikacja-pogodowa</link>
<description>Cześć.&lt;br /&gt;
&lt;br /&gt;
Kończę właśnie aplikację pogodową i praktycnzie jedyną rzeczą jaka mi została, to zapamiętywanie ostatnio wybranych miast i zapisywanie do pliku. Tu mam zagwozdkę, bo dane na temat tych miast mam w MainViewController, a dostęp do metody stop() w głównym launcherze, a po drodze jeszcze jest ViewFactory. Z tego co wyczytałem w internecie i z dokumentacji, statyczny getter w controllerze nie wchodzi w grę. Czy ktoś mógłby mnie nakierować z której strony ugryźć temat, żeby to nie tylko działało, ale miało też ręce i nogi pod względem poprawności z wzorcami projektowymi&amp;gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1108/aplikacja-pogodowa</guid>
<pubDate>Thu, 10 Nov 2022 23:27:47 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa - dodawanie danych prognozy</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1036/aplikacja-pogodowa-dodawanie-danych-prognozy</link>
<description>Mam problem z dodaniem danych prognozy.&lt;br /&gt;
&lt;br /&gt;
Wyświetlaniem danych zajmuje się kontroler WeatherDisplayController, który działa ok, wyświetla wszystkie elementy i pakuje w nie odpowiednie dane. Prognozę wyświetlam w dwóch kolumnach VBox w tym widoku. Udało mi się w te dwa widoki wrzucić osobny widok dla danych prognozy obsługiwany przez ForecastDisplayController (metoda populateInitialForecastBox). Wrzuca się tylko widok i nie umiem do niego upchnąć danych.&lt;br /&gt;
&lt;br /&gt;
Internet mówi, że nie da rady tego zrobić, jeśli zmienne FXML kontrolera Forecast nie są zainicjalizowane. Pewnie częściowo to prawda, ale w takim przypadku kontroler Weather też nie ustawiałby wartości pól dopóki wszystkie nie byłyby zainicjalizowane, a to nie był problem.&lt;br /&gt;
&lt;br /&gt;
Przekazuję dane prognozy do kontrolera Forecast i myślałam, że wartości pól ustawię w metodzie initialize, ale ona się nie uruchamia w ogóle. Dane prognozy są przekazywane poprawnie, bo mogę je wyświetlić używając drugiej metody w tym kontrolerze. W tej metodzie nie mogę przypisać wartości do pól FXML (ani pobranej z danych pogodowych ani stałych), bo dostaję komunikat, że pole ma wartość null.&lt;br /&gt;
&lt;br /&gt;
Doczytałam, że metoda initialize uruchomi się po wywołaniu konstruktora, więc chciałam inicjalizować FXML przez konstruktor. Nie bardzo się da to zrobić w tym przypadku, bo nie można bezpośrednio ustawić im wartości tylko przez setText.&lt;br /&gt;
&lt;br /&gt;
Proszę o podpowiedź jak przekazać konkretne dane do widoku prognozy. Z góry dzięki.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Kod tu: &lt;a href=&quot;https://github.com/MBuchalska/WhatWeather.git&quot; rel=&quot;nofollow&quot;&gt;https://github.com/MBuchalska/WhatWeather.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Kod trzeba oczywiście posprzątać, ale to jak będzie wszystko działało. :) Wiem że tło w apce jest paskudne, ale przynajmniej widać ikonki pogodowe ;).</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1036/aplikacja-pogodowa-dodawanie-danych-prognozy</guid>
<pubDate>Sun, 24 Jul 2022 22:28:13 +0000</pubDate>
</item>
<item>
<title>Programowanie funkcyjne a logger</title>
<link>http://forum.przyszlyprogramista.pl/?qa=1007/programowanie-funkcyjne-a-logger</link>
<description>&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;Mam małe pytanko o stosowanie logger'a w programowaniu funkcyjnym a konkretniej czy w ogóle jest to możliwe? Jeśli tak to w jaki sposób i czy ma to w ogóle sens? Jeśli nie czy jest możliwość stosowania jakiegoś zamiennika?&lt;/p&gt;

&lt;p&gt;Poniżej dwa przykłady:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException {
    return appUserRepository.findByEmail(email)
            .orElseThrow(() -&amp;gt; new UsernameNotFoundException(String.format(USER_NOT_FOUND_MESSAGE, email)));
}
&lt;/pre&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public String signUpUser(AppUser appUser) {
    final boolean isUserExists = appUserRepository.findByEmail(appUser.getEmail()).isPresent();
    if(isUserExists) {

        // Tutaj mogę umieścić logger

        throw new IllegalStateException(EMAIL_ALREADY_TAKEN_MESSAGE);
    }
}&lt;/pre&gt;

&lt;p&gt;Jak widać w drugim przypadku przed rzuceniem wyjątku mogę umieścić logger, natomiast w pierwszym przypadku pozostaje mi jedynie odpowiadnia wiadomość w treści wyjątku.&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=1007/programowanie-funkcyjne-a-logger</guid>
<pubDate>Wed, 06 Jul 2022 16:52:00 +0000</pubDate>
</item>
<item>
<title>JavaFX + Maven - środowisko nie widzi plików Java FX (aplikacja pogodowa)</title>
<link>http://forum.przyszlyprogramista.pl/?qa=977/javafx-maven-%C5%9Brodowisko-widzi-plik%C3%B3w-java-aplikacja-pogodowa</link>
<description>&lt;p&gt;Mam problem z konfiguracją bibliotek JavaFX inny niż do tej pory były :D&lt;/p&gt;

&lt;p&gt;InteliJ jednocześnie widzi i nie widzi elementy pakietu JavaFX. Pisząc kod mogę normalnie zapimportować klasy FXMLLoader czy Stage, mvn clean install pokazuje że wszystko ok, a przy próbie uruchomienia dostaję błąd: &quot;java: package javafx.fxml does not exist&quot;&lt;/p&gt;

&lt;p&gt;To tylko pierwszy błąd, bo dostaję dokładnie taki sam dla każdego pakietu z klasą JFX w każdej klasie, którą mam w projekcie. Próbowałam różnych wersji JFX i FXML ale błąd jest cały czas taki sam. Próbowałam też przepisać klasy ręcznie i nadal to samo. Poradzicie coś?&lt;/p&gt;

&lt;p&gt;Mój plik pom.xml:&lt;/p&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;4.11&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.9.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;11&amp;lt;/version&amp;gt;
      &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;12&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;

  &amp;lt;/dependencies&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;pluginManagement&amp;gt;&amp;lt;!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --&amp;gt;
      &amp;lt;plugins&amp;gt;
        &amp;lt;!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-clean-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.0.2&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;2.22.1&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.0.2&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-install-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-deploy-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;2.8.2&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-site-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.7.1&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-project-info-reports-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
          &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;version&amp;gt;0.0.2&amp;lt;/version&amp;gt;
          &amp;lt;configuration&amp;gt;
            &amp;lt;mainClass&amp;gt;Launcher&amp;lt;/mainClass&amp;gt;
          &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;
      &amp;lt;/plugins&amp;gt;
    &amp;lt;/pluginManagement&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;W klasach mam normalnie zaimportowane pakiety. Np. tu klasa Launcher:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.martabuchalska;

import javafx.application.Application;
import javafx.stage.Stage;
import pl.martabuchalska.view.ViewFactory;


import java.io.*;



public class Launcher extends Application {
    public static void main(String[] args) throws IOException {
        System.out.println(&quot;Hello World!&quot;);

    }

    @Override
    public void start(Stage stage) throws Exception {
        ViewFactory viewFactory = new ViewFactory();
        viewFactory.showMainPage();
    }
}
&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Moja drabinka projektu do obejrzenia pod linkiem: &lt;a href=&quot;https://drive.google.com/file/d/1TsYDbI5cOleTlrOgprFOilQ6_CrCvRvo/view?usp=sharing&quot; rel=&quot;nofollow&quot;&gt;https://drive.google.com/file/d/1TsYDbI5cOleTlrOgprFOilQ6_CrCvRvo/view?usp=sharing&lt;/a&gt; (nie wiem jak się tu wstawia obrazek)&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=977/javafx-maven-%C5%9Brodowisko-widzi-plik%C3%B3w-java-aplikacja-pogodowa</guid>
<pubDate>Wed, 29 Jun 2022 22:07:03 +0000</pubDate>
</item>
<item>
<title>Tworzenie pliku jar - błędy</title>
<link>http://forum.przyszlyprogramista.pl/?qa=964/tworzenie-pliku-jar-b%C5%82%C4%99dy</link>
<description>&lt;p&gt;przy próbie tworzenia pliku jar pojawiają mi się poniższe błędy:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
  - META-INF/LICENSE
gson-2.9.0.jar, jackson-core-2.13.2.jar define 1 overlapping classes: 
  - META-INF.versions.9.module-info
jackson-core-2.13.2.jar, jackson-databind-2.9.10.8.jar, maven-aether-provider-3.0.jar, maven-artifact-3.0.jar, maven-artifact-transfer-0.12.0.jar, maven-common-artifact-filters-3.0.1.jar, maven-core-3.0.jar, maven-dependency-tree-3.0.1.jar, maven-model-3.0.jar, maven-model-builder-3.0.jar, maven-plugin-api-3.0.jar, maven-repository-metadata-3.0.jar, maven-settings-3.0.jar, maven-settings-builder-3.0.jar, maven-shade-plugin-3.2.4.jar, maven-shared-utils-3.1.0.jar, plexus-utils-3.3.0.jar define 1 overlapping resource: 
  - META-INF/NOTICE
commons-codec-1.11.jar, commons-io-2.6.jar, commons-lang3-3.7.jar, javax.annotation-api-1.3.2.jar, jdependency-2.4.0.jar, jdom2-2.0.6.jar define 1 overlapping resource: 
  - META-INF/LICENSE.txt
maven-aether-provider-3.0.jar, maven-artifact-3.0.jar, maven-artifact-transfer-0.12.0.jar, maven-common-artifact-filters-3.0.1.jar, maven-core-3.0.jar, maven-dependency-tree-3.0.1.jar, maven-model-3.0.jar, maven-model-builder-3.0.jar, maven-plugin-api-3.0.jar, maven-repository-metadata-3.0.jar, maven-settings-3.0.jar, maven-settings-builder-3.0.jar, maven-shade-plugin-3.2.4.jar, maven-shared-utils-3.1.0.jar define 1 overlapping resource: 
  - META-INF/DEPENDENCIES
aether-impl-1.7.jar, maven-aether-provider-3.0.jar, maven-artifact-transfer-0.12.0.jar, maven-core-3.0.jar, maven-dependency-tree-3.0.1.jar, maven-model-builder-3.0.jar, maven-settings-builder-3.0.jar, maven-shade-plugin-3.2.4.jar, plexus-cipher-1.4.jar, plexus-sec-dispatcher-1.3.jar, sisu-inject-plexus-1.4.2.jar define 1 overlapping resource: 
  - META-INF/plexus/components.xml
commons-codec-1.11.jar, commons-io-2.6.jar, commons-lang3-3.7.jar, jdependency-2.4.0.jar define 1 overlapping resource: 
  - META-INF/NOTICE.txt
commons-io-2.6.jar, jdependency-2.4.0.jar define 2 overlapping resources: 
  - META-INF/maven/commons-io/commons-io/pom.properties
  - META-INF/maven/commons-io/commons-io/pom.xml
maven-shade-plugin has detected that some class files are
present in two or more JARs. When this happens, only one
single version of the class is copied to the uber jar.
Usually this is not harmful and you can skip these warnings,
otherwise try to manually exclude artifacts based on
mvn dependency:tree -Ddetail=true and the above output.
See http://maven.apache.org/plugins/maven-shade-plugin/&lt;/pre&gt;

&lt;p&gt;Mój plik pom.xml&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;com.weather&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;weather&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;properties&amp;gt;
        &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt;
        &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt;
        &amp;lt;maven.compiler.release&amp;gt;11&amp;lt;/maven.compiler.release&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
        &amp;lt;javafx.version&amp;gt;11&amp;lt;/javafx.version&amp;gt;
        &amp;lt;javafx.maven.plugin.version&amp;gt;0.0.8&amp;lt;/javafx.maven.plugin.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-graphics&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-web&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${javafx.version}&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/com.maxmind.geoip2/geoip2 --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.maxmind.geoip2&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geoip2&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;3.0.1&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/org.elasticsearch/geolite2-databases --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.elasticsearch&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;geolite2-databases&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;20191119&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/com.maxmind.db/maxmind-db --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.maxmind.db&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;maxmind-db&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.9.0&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.fasterxml.jackson.core&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jackson-core&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.13.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.fasterxml.jackson.core&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jackson-databind&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;2.9.10.8&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;

        &amp;lt;!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;javax.annotation&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javax.annotation-api&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade-plugin --&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;3.2.4&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;

    &amp;lt;/dependencies&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;0.0.8&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;mainClass&amp;gt;pl.weather.StarterApp&amp;lt;/mainClass&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;

            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;release&amp;gt;11&amp;lt;/release&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;

            &amp;lt;plugin&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.2.4&amp;lt;/version&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;transformers&amp;gt;
                                &amp;lt;transformer implementation=&quot;org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&quot;&amp;gt;
                                    &amp;lt;mainClass&amp;gt;pl.weather.StarterApp&amp;lt;/mainClass&amp;gt;
                                &amp;lt;/transformer&amp;gt;
                            &amp;lt;/transformers&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;Będę wdzięczny za podpowiedź co robię nie tak&amp;nbsp;&lt;/p&gt;

&lt;p&gt;pozdrawiam&lt;/p&gt;

&lt;p&gt;Aktualizacja z dnia 05.06.2022&lt;/p&gt;

&lt;p&gt;Dostaję dodatkowe błędy w postaci:&lt;/p&gt;

&lt;pre class=&quot;brush:plain;&quot;&gt;
module not found: javafx.fxml
module not found: javafx.controls
module not found: javafx.graphics
module not found: geoip2
module not found: maxmind.db
module not found: com.google.gson
module not found: com.fasterxml.jackson.annotation
module not found: java.annotation
module not found: com.fasterxml.jackson.databind
module not found: com.fasterxml.jackson.core&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=964/tworzenie-pliku-jar-b%C5%82%C4%99dy</guid>
<pubDate>Wed, 01 Jun 2022 19:12:28 +0000</pubDate>
</item>
<item>
<title>Przekazywanie obiektów/danych między kontrolerami, w tym samym oknie aplikacji</title>
<link>http://forum.przyszlyprogramista.pl/?qa=945/przekazywanie-obiekt%C3%B3w-danych-mi%C4%99dzy-kontrolerami-aplikacji</link>
<description>&lt;p&gt;Cześć&lt;/p&gt;

&lt;p&gt;Proszę o pomoc. Od kilku dni próbuję rozwiązać problem.&lt;br&gt;
Aplikacja pogodowa w JavaFX.&lt;br&gt;
&lt;br&gt;
W oknie głównym ładuję okno aplikacji, w którym są dwa panele z domyślną lokalizacją/możliwością wyboru lokalizacji&amp;nbsp;(lewy i prawy).&lt;br&gt;
Okno aplikacji ładuje plik GeneralWindow.fxml który zawiera wszystkie dane dla lewej i prawej części okna aplikacji.&lt;/p&gt;

&lt;p&gt;Pola dla aktualnych danych pogodowych (dla dwóch różnych lokalizacji) wyświetlane są w oknie głównym aplikacji pogodowej i obsługiwane przez kontroler główny.&lt;br&gt;
W pliku okna głównego &quot;zaincludowane&quot; są pliki fxml odpowiedzialne za elementy i lokalizację pól lewej i prawej części - w tych oknach ładuję tylko dane pogodowe dla najbliższych 5 dni - obsługiwane przez poszczególne kontrolery dla prawe i lewej lokalizacji.&lt;br&gt;
W trakcie uruchamiania aplikacji w oknie głównym wyświetlane są: dane dla domyślnej lokalizacji lub po wpisaniu lokalizacji dane dla określonej lokalizacji.&lt;br&gt;
W trakcie ładowania aplikacji lub po wybraniu lokalizacji - przekazuję obiekt &amp;nbsp;z kontrolera głównego do kontrolerów, których pliki fxml są zaincludowane w pliku fxml kontrolera głównego GeneralWindow.fxml celem pobrania z obiektu danych do wyświetlenia w poszczególnych polach na najbliższe 5 dni. &amp;nbsp;&lt;br&gt;
I tu pojawia się problem i moje pytanie:&lt;br&gt;
- program wyrzuca błędy,&lt;br&gt;
- jak przekazać obiekt/dane do sceny wyświetlanej w tym samym oknie aplikacji - po obejrzeniu filmików i stackoverflow i przerobieniu wielu przykładów wpadłem chyba w jakieś niezrozumienie i po prostu nie wiem co zrobić.&amp;nbsp;&lt;br&gt;
Proszę o pomoc!&lt;/p&gt;

&lt;p&gt;Plik głównego kontrolera GeneralWindowController.java&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.weather.controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import pl.weather.WeatherManager;
import pl.weather.model.GeoIP;
import pl.weather.model.LocationUserData;
import pl.weather.model.auxiliaryMethods.DateAndTimeMethods;
import pl.weather.model.auxiliaryMethods.StringMethods;
import pl.weather.model.config.ConfigMainSettings;
import pl.weather.view.ViewFactory;

import java.net.URL;
import java.util.ResourceBundle;

public class GeneralWindowController extends BaseController implements Initializable {

    @FXML
    FiveDaysLeftController fiveDaysLeftController;

    @FXML
    private Label currentDayLabel;

    @FXML
    private Button aboutAppButton;

    @FXML
    private Button closeAppButton;

    @FXML
    private Button updateWeatherButton;

    @FXML
    private Label leftCityLabel;

    @FXML
    private Label leftHumidityLabel;

    @FXML
    private ImageView leftImageView;

    @FXML
    private ImageView rightImageView;

    @FXML
    private TextField leftLocationField;

    @FXML
    private Label leftPressureLabel;

    @FXML
    private Label leftTemperatureLabel;

    @FXML
    private Label leftTimeLabel;

    @FXML
    private Label rightCityLabel;

    @FXML
    private Label rightHumidityLabel;

    @FXML
    private VBox fiveDaysLeft;

    @FXML
    private VBox fiveDaysRight;

    @FXML
    private TextField rightLocationField;

    @FXML
    private Label rightPressureLabel;

    @FXML
    private Label rightTemperatureLabel;

    @FXML
    private Label rightTimeLabel;

    public GeneralWindowController(WeatherManager weatherManager, ViewFactory viewFactory, String fxmlName) {
        super(weatherManager, viewFactory, fxmlName);
    }

    @FXML
    public void closeApplication() {
        javafx.application.Platform.exit();
        System.exit(0);
    }

    @FXML
    public void openAboutApplication() {
        viewFactory.showAboutApplication();
    }

    @FXML
    public void updateWeather(MouseEvent event) {
        if (fieldIsBlank(leftLocationField)) {
            OpenWeatherGeocodingAPIController geocodingController =
                    new OpenWeatherGeocodingAPIController(getCityEnteredInField(leftLocationField));
            OpenWeatherAPIController openWeatherAPIController =
                    new OpenWeatherAPIController(geocodingController.getLatitude(), geocodingController.getLongitude());
            new StringMethods().setPanel(
                    openWeatherAPIController,
                    geocodingController.getCity(),
                    geocodingController.getCountry(),
                    leftTimeLabel,
                    leftCityLabel,
                    leftTemperatureLabel,
                    leftPressureLabel,
                    leftHumidityLabel,
                    leftImageView
            );
            fiveDaysLeftController.setDaysData(openWeatherAPIController);
// tu spotykam problem - jak przekazać obiekt do innego kontrolera 
        }
    }

    private String getCityEnteredInField(TextField field) {
        String cityEnteredInField = field.getText().trim();
        cityEnteredInField = StringMethods.writeFirstLetterCapitalize(cityEnteredInField);
        return cityEnteredInField;
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        updatePromptTextInFields();
        getDefaultWeatherInformation();
    }

    private void getDefaultWeatherInformation() {
        GeoIP geoipLocation = new LocationUserData().getUserLocation(ConfigMainSettings.CHECK_IP_URL_PATH);
        OpenWeatherAPIController defaultWeatherController =
                new OpenWeatherAPIController(
                        geoipLocation.getLatitude(),
                        geoipLocation.getLongitude()
                );
        DateAndTimeMethods.setTextDay(currentDayLabel, defaultWeatherController.getTimezone(), 0);
        new StringMethods().setPanel(
                defaultWeatherController,
                geoipLocation.getCity(),
                geoipLocation.getCountry(),
                leftTimeLabel,
                leftCityLabel,
                leftTemperatureLabel,
                leftPressureLabel,
                leftHumidityLabel,
                leftImageView
        );

    }

    private void updatePromptTextInFields() {
        fieldIsBlank(leftLocationField);
        fieldIsBlank(rightLocationField);
    }

    private boolean fieldIsBlank(TextField field) {
        if (field.getText().isBlank()) {
            field.setText(&quot;&quot;);
            field.setPromptText(&quot;Lokalizacja&quot;);
            return false;
        }
        return true;
    }


}&lt;/pre&gt;

&lt;p&gt;Plik jednego z kontrolerów wyświetlajacych dane pogodowe dla najbliższych 5 dni:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.weather.controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import pl.weather.model.auxiliaryMethods.DateAndTimeMethods;
import pl.weather.model.auxiliaryMethods.StringMethods;

import java.net.URL;
import java.util.ResourceBundle;


public class FiveDaysLeftController {

    @FXML
    Label day1Left;

    @FXML
    Label day2Left;

    @FXML
    Label day3Left;

    @FXML
    Label day4Left;

    @FXML
    Label day5Left;

    @FXML
    ImageView icon1weatherLeft;

    @FXML
    ImageView icon2weatherLeft;

    @FXML
    ImageView icon3weatherLeft;

    @FXML
    ImageView icon4weatherLeft;

    @FXML
    ImageView icon5weatherLeft;

    @FXML
    Label temperature1Left;

    @FXML
    Label temperature2Left;

    @FXML
    Label temperature3Left;

    @FXML
    Label temperature4Left;

    @FXML
    Label temperature5Left;

// chwilowo zakomentowane
//    @Override
//    public void initialize(URL url, ResourceBundle resourceBundle) {
//
//    }


    public void setDaysData(OpenWeatherAPIController openWeatherAPIController) {

        String timeZone = openWeatherAPIController.getTimezone();

        DateAndTimeMethods.setTextNextDay(day1Left, timeZone, 1);
        DateAndTimeMethods.setTextNextDay(day2Left, timeZone, 2);
        DateAndTimeMethods.setTextNextDay(day3Left, timeZone, 3);
        DateAndTimeMethods.setTextNextDay(day4Left, timeZone, 4);
        DateAndTimeMethods.setTextNextDay(day5Left, timeZone, 5);

        icon1weatherLeft.setImage(openWeatherAPIController.getNextDayIcon(0));
        icon2weatherLeft.setImage(openWeatherAPIController.getNextDayIcon(1));
        icon3weatherLeft.setImage(openWeatherAPIController.getNextDayIcon(2));
        icon4weatherLeft.setImage(openWeatherAPIController.getNextDayIcon(3));
        icon5weatherLeft.setImage(openWeatherAPIController.getNextDayIcon(4));

        temperature1Left.setText(openWeatherAPIController.getDailyTemperatureNextDay(0)
                + &quot; / &quot; + openWeatherAPIController.getNightTemperatureNextDay(0) + StringMethods.addTempUnit());
        temperature2Left.setText(openWeatherAPIController.getDailyTemperatureNextDay(1)
                + &quot; / &quot; + openWeatherAPIController.getNightTemperatureNextDay(1) + StringMethods.addTempUnit());
        temperature3Left.setText(openWeatherAPIController.getDailyTemperatureNextDay(2)
                + &quot; / &quot; + openWeatherAPIController.getNightTemperatureNextDay(2) + StringMethods.addTempUnit());
        temperature4Left.setText(openWeatherAPIController.getDailyTemperatureNextDay(3)
                + &quot; / &quot; + openWeatherAPIController.getNightTemperatureNextDay(3) + StringMethods.addTempUnit());
        temperature5Left.setText(openWeatherAPIController.getDailyTemperatureNextDay(4)
                + &quot; / &quot; + openWeatherAPIController.getNightTemperatureNextDay(4) + StringMethods.addTempUnit());
    }


}
&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=945/przekazywanie-obiekt%C3%B3w-danych-mi%C4%99dzy-kontrolerami-aplikacji</guid>
<pubDate>Sun, 15 May 2022 16:20:10 +0000</pubDate>
</item>
<item>
<title>Spring -&gt; MySQL</title>
<link>http://forum.przyszlyprogramista.pl/?qa=931/spring-mysql</link>
<description>&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;Ostatnio pracuje nad bardzo prostą aplikacją, żeby przećwiczyć połączenia między frontem, backend'em i bazą danych. I właśnie z tym ostatnim mam teraz drobny problem.&lt;/p&gt;

&lt;p&gt;Staram się wykonać połączenie ze zdalną bazą danych za pomocą Spring'a. Nie mam problemu z połączeniem w przypadku lokalnej bazy danych lub bazy z xampp'a (mogę bezpośrednio uzyskać dostęp i edytować dane) natomiast docelowo chciałbym korzystać z bazy znajdującej się na jakimś serwerze. Dlatego teraz próbuję połączyć się z bazą MySQL na Netmark'u. Poniżej kod jaki mam obecnie:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
spring:
  datasource:
    url: jdbc:mysql://cl12.netmark.pl:2083/nazwa_bazy
    username: :-)
    password: :-)
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: true
    show-sql: true&lt;/pre&gt;

&lt;p&gt;Wiem, że domyślny port to 3306 ale w przypadku Netmark'a nie działa - w adresie url podany jest 2083. Po uruchomieniu aplikacji dostaję błąd:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Packet for query is too large (5&amp;nbsp;526&amp;nbsp;600 &amp;gt; 65&amp;nbsp;535)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;nbsp;I tutaj pojawia się moje pytanie co mogę z tym zrobić? &lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;&lt;/p&gt;

&lt;p&gt;Teoretycznie powinno się zwiększyć 'max_allowed_packet' w ustawieniach serwera, ale wątpię, że Netmark zmieni to dla mojej zachcianki (nie pytałem jeszcze). Czy w takim razie mogę obejść to w jakiś inny sposób lub w ogóle użyć innej metody połączenia?&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=931/spring-mysql</guid>
<pubDate>Sun, 08 May 2022 20:58:28 +0000</pubDate>
</item>
<item>
<title>TestFx + mockowanie</title>
<link>http://forum.przyszlyprogramista.pl/?qa=804/testfx-mockowanie</link>
<description>&lt;p&gt;Hej,&lt;/p&gt;

&lt;p&gt;Kolejne pytanie odnośnie do testowania aplikacji! (hah)&lt;/p&gt;

&lt;p&gt;Powiedzmy, że mam taką klasę z jedną metodą:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public class AddDeleteLocationViewController extends BaseController implements Initializable {

    ConvertingCountryNames convertingCountryNames = new ConvertingCountryNames();
    WeatherClient weatherClient = new WeatherClient();

    @FXML
    private TextField countryTextField;

    @FXML
    private TextField cityTextField;

    @FXML
    private TableView&amp;lt;City&amp;gt; tableView;

    @FXML
    private TreeView&amp;lt;String&amp;gt; treeView;

    @FXML
    private Label errorLabel;

    public AddDeleteLocationViewController(String fxmlName) {
        super(fxmlName);
    }

    @FXML
    void addLocaleAction() {
        resetErrorLabel();

        String countryName = countryTextField.getText();
        String cityName = cityTextField.getText();

        convertingCountryNames = new ConvertingCountryNames();
        weatherClient = new WeatherClient();

        try {
            String countryISO = convertingCountryNames.convertNameToISO(countryName);
            City cityObj = weatherClient.getCityInfo(cityName, countryISO);
            CustomLocations.addLocation(treeView, countryName, cityObj);
            CustomLocations.saveLocationsToFile();

        } catch (IllegalArgumentException e) {
            errorLabel.setText(ErrorMessages.WEATHER_API_TYPO_IN_ADDING_LOCATION);
            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e) {
            errorLabel.setText(ErrorMessages.WEATHER_API_TYPO_IN_ADDING_CITY);
            e.printStackTrace();
        } catch (ApiException e) {
            errorLabel.setText(ErrorMessages.WEATHER_API_COULD_NOT_LOAD_CITY_DATA);
            e.printStackTrace();
        }
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Niektóre zmienne, czy inne elementy mogą być niepotrzebne w tym wycinku, bo po prostu skopiowałem część tej klasy, o którą chciałem zapytać.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Chodzi mi o właściwe przetestowanie tej metody. Przypisana jest ona do przycisku, który zatwierdza zapisywanie wpisanej przez użytkownika lokalizacji (państwo i kraj pobierane z&amp;nbsp;oddzielnych pól tekstowych). Lokalizacja zapisywana jest do TreeView.&lt;/p&gt;

&lt;p&gt;I teraz jak mam tę funkcjonalność przetestować? Jeśli chodzi o optymistyczny scenariusz to mogę:&lt;/p&gt;

&lt;p&gt;1. Korzystając z biblioteki testfx zimitować wypełnienie pól, naciśnięcie przycisku i sprawdzenie czy w TreeView znajduje się to, czego się spodziewam.&amp;nbsp;A w kolejnym teście&amp;nbsp;czy właściwy plik również jest tworzony.&lt;/p&gt;

&lt;p&gt;2. Korzystając z biblioteki testfx zrobić to co wyżej, z tym że zatrzymać się na sprawdzeniu czy metody&amp;nbsp;&lt;strong&gt;addLocation()&lt;/strong&gt;&amp;nbsp;i&amp;nbsp;&lt;strong&gt;saveLocationToFile()&lt;/strong&gt;&amp;nbsp;zostały wywołane.&lt;/p&gt;

&lt;p&gt;Jeśli chodzi o testowanie wyjątków to już jest chyba prościej, bo sprawdzam czy został rzucony wyjątek. Ale kolejne pytanie mi się nasuwa:&amp;nbsp;&lt;strong&gt;Co z mockowaniem&lt;/strong&gt;? Mam mockować metody&amp;nbsp;&lt;strong&gt;convertNameToISO()&lt;/strong&gt;&amp;nbsp;i&amp;nbsp;&lt;strong&gt;getCityInfo()&lt;/strong&gt;? Wydaje mi się, że powinienem. Tylko tak... Tworzenie mocków w taki sposób:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
ConvertingCountryNames convertingCountryNames = mock(ConvertingCountryNames.class);
WeatherClient weatherClient = mock(WeatherClient.class);&lt;/pre&gt;

&lt;p&gt;...odpada, bo nie mam jak tych obiektów &quot;wcisnąć&quot; do kontrolera &lt;strong&gt;AddDeleteLocationController&lt;/strong&gt;&amp;nbsp;- testfx jakoś sam to ogarnia chyba... A jak używam adnotacji:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
@InjectMocks
AddDeleteLocationViewController addDeleteLocationViewController;

@Mock
ConvertingCountryNames convertingCountryNames;

@Mock
WeatherClient weatherClient;&lt;/pre&gt;

&lt;p&gt;...to potem w teście już w tym miejscu:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
given(convertingCountryNames.convertNameToISO(any(String.class))).willReturn(&quot;Proper ISO code&quot;);&lt;/pre&gt;

&lt;p&gt;Wyskakuje mi NullPointerException.&lt;/p&gt;

&lt;p&gt;Jest jakiś sposób, żeby coś z tym zrobić? Może stworzyć jakoś kontroler&amp;nbsp;&lt;strong&gt;AddDeleteLocationController&lt;/strong&gt;&amp;nbsp;w klasie testowej i wtedy podmienić ten właściwy tym z klasy testowej, który będzie już miał zamockowane obiekty&amp;nbsp;&lt;strong&gt;ConvertingCountryNames &lt;/strong&gt;i &lt;strong&gt;WeatherClient&lt;/strong&gt;? Nie wiem...&lt;/p&gt;

&lt;p&gt;Pozdrawiam&lt;br&gt;
Adrian&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=804/testfx-mockowanie</guid>
<pubDate>Thu, 23 Dec 2021 10:26:41 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa - testy jednostkowe</title>
<link>http://forum.przyszlyprogramista.pl/?qa=777/aplikacja-pogodowa-testy-jednostkowe</link>
<description>Hej!&lt;br /&gt;
&lt;br /&gt;
Jestem na etapie pisania testów jednostkowych do aplikacji pogodowej i trafiłem na coś takiego:&lt;br /&gt;
&lt;br /&gt;
Klasa WeatherViewController ma (nie licząc konstruktora i inicjalizatora - powiedzmy takiego drugiego konstruktora) wszystkie metody prywatne. Działa ona głównie na listenerach, które są podpięte do konkretnych elementów, które użytkownik może zmieniać. Taka zmiana jest przechwytywana przez konkretny listener i wykonywana na bieżąco. Stąd ta klasa nie potrzebuje żadnych metod publicznych, bo każdy listener jest podpinany w inicjalizatorze. Moje pytanie: Jak ja mam coś takiego przetestować? &lt;br /&gt;
&lt;br /&gt;
Link do klasy: &lt;a href=&quot;https://github.com/Naioku/NaiokuFirstWeatherApp/blob/79a78b71d09d1763d352049c497f877a88eacb89/src/main/java/pl/adrian_komuda/controllers/WeatherViewController.java&quot; rel=&quot;nofollow&quot;&gt;https://github.com/Naioku/NaiokuFirstWeatherApp/blob/79a78b71d09d1763d352049c497f877a88eacb89/src/main/java/pl/adrian_komuda/controllers/WeatherViewController.java&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Pozdrawiam&lt;br /&gt;
Adrian</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=777/aplikacja-pogodowa-testy-jednostkowe</guid>
<pubDate>Tue, 14 Dec 2021 10:40:36 +0000</pubDate>
</item>
<item>
<title>Kilka pytań odnośnie planowania projektu w Javie</title>
<link>http://forum.przyszlyprogramista.pl/?qa=770/kilka-pyta%C5%84-odno%C5%9Bnie-planowania-projektu-w-javie</link>
<description>&lt;p&gt;Witam wszystkich,&lt;/p&gt;

&lt;p&gt;Rozpoczynam pracę nad nowym projektem w Javie i podczas planowania aplikacji nasunęło mi się kilka zagadek:&lt;/p&gt;

&lt;p&gt;1. W jaki sposób powinno się rozmieszczać klasy w projekcie? Czy klasy powinno się dzielić według roli w projekcie, czyli na przykład w osobnej paczce modele, w innej kontrolery itd. czy może ze względu na funkcje w aplikacji czyli na przykład w danej paczce będą wszystkie klasy (modele, kontrolery itd), które odpowiadają za obsługę logowania i rejestracji a w innej na przykład za obsługę zadania do wykonania. Osobiście drugie podejście wydaje mi się lepsze, ponieważ wtedy w projekcie nie trzeba &quot;szukać&quot; plików, które współpracują ze sobą i powinno być łatwiej użyć daną funkcjonalność w innych projektach.&lt;/p&gt;

&lt;p&gt;2. Gdzie powinna znajdować się granica między backend a frontend? Pomijam oczywiste funkcje backend'u, czyli na przykład pobieranie danych z bazy, i frontendu, czyli na przykład stylizowanie strony. Zakładając, że z bazy pobrałem dane, które nie są posortowane to czy sortowanie powinno odbyć się przed wysłaniem danych do frontu czy już w samym froncie? Bo sama możliwość sortowania jest dostępna i w Javie i w JavaScript.&lt;/p&gt;

&lt;p&gt;Jakie jest Wasze zdanie na ten temat? &lt;img alt=&quot;wink&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/wink_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;wink&quot;&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=770/kilka-pyta%C5%84-odno%C5%9Bnie-planowania-projektu-w-javie</guid>
<pubDate>Wed, 08 Dec 2021 21:42:08 +0000</pubDate>
</item>
<item>
<title>Testowanie funkcjonalności JavaFX</title>
<link>http://forum.przyszlyprogramista.pl/?qa=749/testowanie-funkcjonalno%C5%9Bci-javafx</link>
<description>&lt;p&gt;Cześć,&lt;/p&gt;

&lt;p&gt;Jestem na etapie pisania testów do aplikacji pogodowej. Natrafiłem na wątpliwości co do tego jak testować kontroler, w którym znajdują się komponenty z JavaFX. Oto kod mojego kontrolera obsługującego prognozę pogody dla pojedynczego miasta:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public class WeatherController extends BaseController implements Initializable {

    public static final DateTimeFormatter LONG_DAY_NAME = DateTimeFormatter.ofPattern(&quot;EEEE&quot;);
    public static final DateTimeFormatter SHORT_DAY_NAME = DateTimeFormatter.ofPattern(&quot;EEE&quot;);
    private int homeSelectedDayNumber;
    private final String title;
    private final WeatherManager weatherManager = new WeatherManager();
    private final IntegerProperty fontSize = new SimpleIntegerProperty();
    private final IntegerProperty anchorWidth = new SimpleIntegerProperty();
    private final IntegerProperty gridControlWidth = new SimpleIntegerProperty();

    @FXML
    private AnchorPane mainAnchorPane;

    @FXML
    private Label titleLabel;

    @FXML
    private GridPane gridPane;

    @FXML
    private TextField countryField;
    
    @FXML
    private Button confirmButton;

    @FXML
    private TextField cityField;

    @FXML
    private Label countryAndTownLabel;

    @FXML
    private Label dayAndHourLabel;

    @FXML
    private HBox leftHBox;

    @FXML
    private HBox rightHBox;

    @FXML
    private Label tempLabel;

    @FXML
    private ImageView imageView;

    @FXML
    private Label precipitationLabel;

    @FXML
    private Label pressureLabel;

    @FXML
    private Label windLabel;

    @FXML
    private Label cloudyLabel;

    @FXML
    private Slider slider;

    @FXML
    private Label infoLabel;

    @FXML
    void confirmButtonAction() {
        confirmButton.setDisable(true);
        displayWeather(cityField, infoLabel, weatherManager, gridPane);
    }

    @FXML
    void townFieldKeyPressedAction(KeyEvent event) {
        if (event.getCode() == KeyCode.ENTER &amp;amp;&amp;amp; !confirmButton.isDisabled()) {
            confirmButtonAction();
        }
    }

    public WeatherController(WeatherService weatherService, ViewFactory viewFactory,
                             String fxmlName, String title) {
        super(weatherService, viewFactory, fxmlName);
        this.title = title;
    }

    private void displaySelectedPoint() {
        setCountryAndTownLabel();
        setDayAndHourLabel();
        setTempValue();
        setWeatherIcon();
        setPrecipitationProbability();
        setPressureValue();
        setWindSpeed();
        setCloudyValue();
    }

    private void setCloudyValue() {
        int cloudyValue = getCurrentWeatherPoint().getWeatherData().getJSONObject(&quot;clouds&quot;).getInt(&quot;all&quot;);
        cloudyLabel.setText(&quot;zachmurzenie: &quot; + cloudyValue + &quot;%&quot;);
    }

    private void setWindSpeed() {
        double windSpeed = getCurrentWeatherPoint().getWeatherData().getJSONObject(&quot;wind&quot;).getDouble(&quot;speed&quot;);
        windLabel.setText(&quot;wiatr: &quot; + windSpeed + &quot; m/s&quot;);
    }

    private void setPressureValue() {
        int pressureValue = getCurrentWeatherPoint().getWeatherData().getJSONObject(&quot;main&quot;).getInt(&quot;pressure&quot;);
        pressureLabel.setText(&quot;ciśnienie: &quot; + pressureValue + &quot; hPa&quot;);
    }

    private void setPrecipitationProbability() {
        double pop = getCurrentWeatherPoint().getWeatherData().getDouble(&quot;pop&quot;);
        precipitationLabel.setText(&quot;opady: &quot; + (int) (pop * 100) + &quot;%&quot;);
    }

    private void setDayAndHourLabel() {
        String dayName = SHORT_DAY_NAME.format(weatherManager.getSelectedWeatherDay().getDate());
        String hour = weatherManager.getSelectedWeatherPoint().getHour();
        dayAndHourLabel.setText(dayName + &quot; &quot; + hour);
    }

    private void setCountryAndTownLabel() {
        String countryCode = weatherManager.getCountryCode();
        Locale loc = new Locale(&quot;&quot;, countryCode);
        countryAndTownLabel.setText(loc.getDisplayCountry() + &quot;, &quot; + weatherManager.getCityName());
    }

    private void setWeatherIcon() {
        Image image = getCurrentWeatherPoint().getWeatherIcon();
        imageView.setImage(image);
    }

    private void setTempValue() {
        int intTempValue = getCurrentWeatherPoint().getTempValue();
        tempLabel.setText(intTempValue + &quot;\u00B0C&quot;);
    }

    private WeatherPoint getCurrentWeatherPoint() {
        return weatherManager.getSelectedWeatherPoint();
    }

    private void displayWeather(TextField cityField, Label infoLabel, WeatherManager weatherManager, GridPane gridPane) {
        String cityValue = cityField.getText().toLowerCase();
        changeWeatherDataVisible(false);
        infoLabel.setText(&quot;Wczytuję...&quot;);
        infoLabel.setVisible(true);

        if (!cityValue.equals(&quot;&quot;)) {
            weatherService.setCityName(cityValue);
            weatherService.restart();
            weatherService.setOnSucceeded(e1 -&amp;gt; {
                weatherManager.setWeatherDayList(new ArrayList&amp;lt;&amp;gt;());
                FetchWeatherService fetchWeatherService = weatherService.getFetchWeatherService();
                JSONObject weatherServiceResult = weatherService.getValue();
                fetchWeatherService.setWeatherJSON(weatherServiceResult);
                fetchWeatherService.setWeatherDayList(weatherManager.getWeatherDayList());
                fetchWeatherService.restart();
                fetchWeatherService.setOnSucceeded(e2 -&amp;gt; {
                    FetchWeatherResult fetchWeatherResult = fetchWeatherService.getValue();
                    switch (fetchWeatherResult) {
                        case SUCCESS:
                            processResult(infoLabel, weatherManager, gridPane, weatherServiceResult);
                            break;
                        case FAILED_BY_TOWN_NAME:
                            infoLabel.setText(&quot;Nie znaleziono miasta!&quot;);
                            break;
                        case FAILED_BY_UNEXPECTED_ERROR:
                            infoLabel.setText(&quot;Wystąpił błąd!&quot;);
                            break;
                    }
                    confirmButton.setDisable(false);
                });
                fetchWeatherService.setOnFailed(event -&amp;gt; infoLabel.setText(&quot;Brak połączenia z internetem!&quot;));
            });
        } else {
            infoLabel.setText(&quot;Nic nie wpisano!&quot;);
            confirmButton.setDisable(false);
        }

    }

    private void processResult(Label infoLabel, WeatherManager weatherManager, GridPane gridPane,
                           JSONObject weatherServiceResult) {
        JSONObject cityData = weatherServiceResult.getJSONObject(&quot;city&quot;);
        weatherManager.setCityName(cityData.getString(&quot;name&quot;));
        weatherManager.setCountryCode(cityData.getString(&quot;country&quot;));
        int i = 0;
        for (WeatherDay weatherDay : weatherManager.getWeatherDayList()) {
            Node node = gridPane.getChildren().get(i++);
            AnchorPane anchorPane = (AnchorPane) node;
            String dayOfWeek = LONG_DAY_NAME.format(weatherDay.getDate());
            ((Label) anchorPane.getChildren().get(0)).setText(dayOfWeek);
            ((ImageView) anchorPane.getChildren().get(1)).setImage(weatherDay.getMiddlePointWeatherIcon());
            ((Label) anchorPane.getChildren().get(2)).setText(weatherDay.getAverageTemperature() + &quot;\u00B0C&quot;);
        }
        homeSelectedDayNumber = 0;
        selectDay();
        prepareSlider();
        infoLabel.setVisible(false);
        changeWeatherDataVisible(true);
    }

    private void prepareSlider() {
        if (slider.getMajorTickUnit() != 1) {
            setUpSlider(slider);
        } else {
            updateSlider(slider);
        }
    }

    private void setUpSlider(Slider slider) {
        slider.setMajorTickUnit(1);
        slider.setMinorTickCount(0);
        updateSlider(slider);
        slider.valueProperty().addListener((observable, oldValue, newValue) -&amp;gt; {
            if (!slider.isValueChanging() &amp;amp;&amp;amp; !newValue.equals(oldValue)) {
                newValue = newValue.intValue();
                weatherManager.setSelectedWeatherPoint(weatherManager.getChosenWeatherPoint((int) newValue));
                displaySelectedPoint();
            }
        });
    }

    private void updateSlider(Slider slider) {
        slider.setMax(weatherManager.getSelectedWeatherDay().getWeatherPointsCount()-1);
        slider.setValue(0);
        slider.setLabelFormatter(null);
        slider.setLabelFormatter(new StringConverter&amp;lt;&amp;gt;() {
            @Override
            public String toString(Double d) {
                return weatherManager.getChosenWeatherPoint(d.intValue()).getHour();
            }
            @Override
            public Double fromString(String s) {
                return null;
            }
        });
    }

    private void changeWeatherDataVisible(boolean visibleStatus) {
        countryAndTownLabel.setVisible(visibleStatus);
        dayAndHourLabel.setVisible(visibleStatus);
        leftHBox.setVisible(visibleStatus);
        rightHBox.setVisible(visibleStatus);
        slider.setVisible(visibleStatus);
        gridPane.setVisible(visibleStatus);
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        initiateGridNodeCoords();
        titleLabel.setText(title);
        fontSize.bind(tempLabel.widthProperty().divide(2.3));
        anchorWidth.bind(gridPane.widthProperty().divide(2));
        gridControlWidth.bind(gridPane.widthProperty().divide(6).subtract(10));
        leftHBox.prefWidthProperty().bind(anchorWidth);
        rightHBox.prefWidthProperty().bind(anchorWidth);
        tempLabel.styleProperty().bind(Bindings.concat(&quot;-fx-font-size: &quot;, fontSize));
        tempLabel.prefWidthProperty().bind(anchorWidth.divide(3).multiply(2));
        imageView.fitWidthProperty().bind(anchorWidth.divide(3));
        imageView.fitHeightProperty().bind(anchorWidth.divide(3));
        for (Node node : gridPane.getChildren()) {
            AnchorPane anchorPane = (AnchorPane) node;
            anchorPane.prefWidthProperty().bind(gridControlWidth);
            for (Node node1 : anchorPane.getChildren()) {
                if (node1 instanceof Label) {
                    Label label = (Label) node1;
                    label.prefWidthProperty().bind(gridControlWidth);
                } else {
                    ImageView imageView = (ImageView) node1;
                    imageView.translateXProperty().bind(gridControlWidth.subtract(imageView.getFitWidth()).divide(2));
                }
            }
        }
    }

    private void initiateGridNodeCoords() {
        int i = 0;
        for (Node node : gridPane.getChildren()) {
            node.setOnMouseClicked(mouseEvent -&amp;gt; {
                homeSelectedDayNumber = GridPane.getColumnIndex(node);
                selectDay();
         &lt;/pre&gt;

&lt;p&gt;Jak widać większość metod jest tutaj prywatna i jest wywoływana poprzez jakieś zdarzenie. O ile w innych przypadkach nie testuje się metod prywatnych, bo to szczegół implementacji niewidoczny na zewnątrz, tak tu wydaje mi się, że należało by je przetestować. Widziałem w sieci artykuł, który opisuje bibliotekę TestFX gdzie po uruchomieniu można właśnie zasymulować akcję. Jestem ciekaw opinii forumowiczów jak podejść do tego problemu.&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=749/testowanie-funkcjonalno%C5%9Bci-javafx</guid>
<pubDate>Sun, 28 Nov 2021 17:31:56 +0000</pubDate>
</item>
<item>
<title>Testy jednostkowe - artykuł o TDD</title>
<link>http://forum.przyszlyprogramista.pl/?qa=741/testy-jednostkowe-artyku%C5%82-o-tdd</link>
<description>&lt;p&gt;Hej! Mam takie pola i dwie metody w abstrakcyjnej klasie Weapon:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
Entity owner;
int attackDamage;
double sufficientDistanceToHurt;

void doDamage(Entity entity) {
   if (isDistanceSufficient(entity)) {
       entity.setHealth(entity.getHealth() - getAttackDamage());
   }
}

boolean isDistanceSufficient(Entity entity) {
   double distance = Helpers.calculateDistance(owner.getCoordinates(), entity.getCoordinates());

   return distance &amp;lt;= sufficientDistanceToHurt;
}
&lt;/pre&gt;

&lt;p&gt;Chcę przetestować czy doDamage() zmniejszy obrażenia przekazanej jako argument tej metody jednostce (entity). Żeby wykluczyć testowanie metody isDistanceSufficient() pomyślałem, że zamockuję klasę Weapon. Ale potrzebuję wywołania prawdziwej metody doDamage(), dlatego zdecydowałem się na obiekt spy. Napisałem następującą metodę testową:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
@Test
void targetShouldBeDamagedWithProperValueWhenDistanceIsSufficientWithSpy() {
   // given
   Entity entity = new NPC(100, new Coordinates(50, 50));

   Weapon weaponSpy = spy(Weapon.class);
   given(weaponSpy.getAttackDamage()).willReturn(10);
   given(weaponSpy.isDistanceSufficient(entity)).willReturn(true);

   // when
   weaponSpy.doDamage(entity);

   // then
   assertThat(entity.getHealth()).isEqualTo(entity.getHealth() - weaponSpy.getAttackDamage());
}
&lt;/pre&gt;

&lt;p&gt;Odpowiedź, jaką dostaję, wskazuje mi na NullPointerException w linijce z:&lt;/p&gt;

&lt;pre class=&quot;brush:plain;&quot;&gt;
double distance = Helpers.calculateDistance(owner.getCoordinates(), entity.getCoordinates());&lt;/pre&gt;

&lt;p&gt;w metodzie isDistanceSufficient()... Domyślam się, że to dlatego, że owner nie jest ustawiony, ale dlaczego w ogóle wywołuje się ta metoda, skoro w metodzie testowej napisałem, żeby przy wywołaniu isDistanceSufficient() na obiekcie klasy Weapon było zawsze zwracane true?&lt;/p&gt;

&lt;p&gt;Jak w poprzednim poście już pisałem, jestem na samym początku nauki testowania i to wszystko jest dla mnie ciągle mgliste… I wymyślenie przykładowego kodu, w którym zawrę sposób testowania TDD wraz ze stubami, mockami i obiektami spy z mojego punktu widzenia&amp;nbsp;nie jest najłatwiejsze, dlatego może robię coś tutaj na siłę, żeby tylko użyć spy. No ale nie wiem... Będę wdzięczny jak ktoś mi wytłumaczy, o co tu chodzi. :)&lt;/p&gt;

&lt;p&gt;Adrian&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=741/testy-jednostkowe-artyku%C5%82-o-tdd</guid>
<pubDate>Tue, 23 Nov 2021 10:44:13 +0000</pubDate>
</item>
<item>
<title>Testy jednostkowe - który lepszy?</title>
<link>http://forum.przyszlyprogramista.pl/?qa=682/testy-jednostkowe-kt%C3%B3ry-lepszy</link>
<description>&lt;p&gt;Hej!&amp;nbsp;Krótkie pytanie z etapu Unit Testów. Mamy klasę (pomijam wszędzie importy):&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public class UnitService {

    private CargoRepository cargoRepository = new CargoRepository();
    private UnitRepository unitRepository = new UnitRepository();

    void addCargoByName(Unit unit, String name) {

        Optional&amp;lt;Cargo&amp;gt; cargo = cargoRepository.findCargoByName(name);

        if (cargo.isPresent()) {
            unit.loadCargo(cargo.get());
        } else {
            throw new NoSuchElementException(&quot;Unable to find cargo&quot;);
        }
    }

    Unit getUnitOn(Coordinates coordinates) {

        Unit u = unitRepository.getUnitByCoordinates(coordinates);

        if (u == null) {
            throw new NoSuchElementException(&quot;Unable to find any unit&quot;);
        } else {
            return u;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;jak również klasy:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;CargoRepository&lt;/li&gt;
	&lt;li&gt;UnitRepository&lt;/li&gt;
	&lt;li&gt;Cargo&lt;/li&gt;
	&lt;li&gt;Unit&lt;/li&gt;
	&lt;li&gt;Coordinates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ale ich implementacje wg mnie nie są istotne.&lt;/p&gt;

&lt;p&gt;I teraz w trzeba było napisać klasę testującą. W kursie na Udemy&amp;nbsp;pierwszy test wygląda tak:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
@ExtendWith(MockitoExtension.class)
public class UnitServiceTest {

    @Mock
    private CargoRepository cargoRepository;

    @Mock
    private UnitRepository unitRepository;

    @InjectMocks
    private UnitService unitService;


    @Test
    void addedCargoShouldBeLoadedOnUnit() {

        //given
        Unit unit = new Unit(new Coordinates(0, 0), 10, 10);
        Cargo cargo = new Cargo(&quot;package&quot;, 5);

        given(cargoRepository.findCargoByName(&quot;package&quot;)).willReturn(Optional.of(cargo));

        //when
        unitService.addCargoByName(unit, &quot;package&quot;);

        //then
        verify(cargoRepository).findCargoByName(&quot;package&quot;);
        assertThat(unit.getLoad(), is(5));
        assertThat(unit.getCargo().get(0), equalTo(cargo));

    }
}&lt;/pre&gt;

&lt;p&gt;Natomiast mój test tak:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
@ExtendWith(MockitoExtension.class)
class UnitServiceTest {

    @Mock
    private CargoRepository cargoRepository;

    @Mock
    private UnitRepository unitRepository;

    @InjectMocks
    private UnitService unitService;

    @Mock
    private Unit unit;

    private final String unitName = &quot;Unit1&quot;;

    @Test
    void loadCargoShouldBeExecuted() {
        // given
        // unit
        // unitName

        Cargo cargo = new Cargo(unitName, 20);

        given(cargoRepository.findCargoByName(unitName)).willReturn(Optional.of(cargo));

        // when
        unitService.addCargoByName(unit, unitName);

        // then
        verify(unit).loadCargo(cargo);
    }
}&lt;/pre&gt;

&lt;p&gt;Oba się uruchamiają i przechodzą. Moje pytanie jest następujące: &quot;Czy mój test nie jest bardziej zgodny z ideą testów jednostkowych?&quot;. W kursie chłopaki sprawdzają metodę z cargoRepository i jeszcze czy zgadzają im się parametry unita. Ja zwyczajnie sprawdzam czy metoda loadCargo() na unicie się wywoła. Nie zagłębiam się w to jak działa klasa cargoRepository. Czy to nie o to chodzi w testach jednostkowych? Chyba, że czegoś nie rozumiem - jestem świeżo po przerobieniu tego tematu i czuję się bardziej zielony niż trawa na wiosnę...&lt;/p&gt;

&lt;p&gt;Z góry dziękuję za poświęcony mi czas!&lt;br&gt;
Adrian&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=682/testy-jednostkowe-kt%C3%B3ry-lepszy</guid>
<pubDate>Sun, 07 Nov 2021 22:04:46 +0000</pubDate>
</item>
<item>
<title>Java - narzędzia do tworzenia widoku aplikacji</title>
<link>http://forum.przyszlyprogramista.pl/?qa=634/java-narz%C4%99dzia-do-tworzenia-widoku-aplikacji</link>
<description>&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;Chciałem was prosić o poradę jakich narzędzi/bibliotek/frameworków polecacie użyć bądź używacie na co dzień, do budowania widoku aplikacji webowej w Javie. Mam w planach stworzenie większej aplikacji więc przy okazji chciałbym się douczyć i wykorzystać narzędzia, które mogłyby się przydać &lt;img alt=&quot;wink&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/wink_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;wink&quot;&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=634/java-narz%C4%99dzia-do-tworzenia-widoku-aplikacji</guid>
<pubDate>Sun, 17 Oct 2021 11:14:00 +0000</pubDate>
</item>
<item>
<title>Java — jak zamockować połączenie z API?</title>
<link>http://forum.przyszlyprogramista.pl/?qa=591/java-jak-zamockowa%C4%87-po%C5%82%C4%85czenie-z-api</link>
<description>&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;jak w temacie, chciałbym zamockować połączenie z API i przetestować metody pobierające poszczególne składowe odpowiedzi. Problem w tym, że prawie w ogóle nie wiem jak się za to zabrać.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Mam klasę ApiData, w której znajduje się metoda łącząca się z API:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
protected void connectToApi(String cityName, String mainAPIPart, String additionalAPIPart) throws MalformedURLException {
        this.url = new URL(mainAPIPart + cityName + additionalAPIPart + getApiKey());
        HttpURLConnection conn;
        try {
            conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod(&quot;GET&quot;);
            conn.setRequestProperty(&quot;Accept&quot;, &quot;application/json;charset=UTF-8&quot;);
            conn.connect();
            this.responseCode = conn.getResponseCode();
        } catch (IOException e) {
            DialogUtils.errorDialog(e.getMessage());
        }
    }&lt;/pre&gt;

&lt;p&gt;Metoda ta wywoływana jest w metodzie klasy&amp;nbsp;&lt;em&gt;WheatherDataClient&lt;/em&gt;, którą chcę przetestować.&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public void loadWeatherData(String cityName)  {
        try {
            connectToApi(cityName, getMainAPIPart(), getAdditionalAPIPart());
        } catch (MalformedURLException e) {
            DialogUtils.errorDialog(e.getMessage());
        }

        String result = &quot;&quot;;
        try {
            result = getResult();
        } catch (IOException e) {
            DialogUtils.errorDialog(e.getMessage());
        }

        JSONObject jsonObject = JSONConverter.convertStringToJSONObject(result);
        allDataJsonArray = jsonObject.getJSONArray(&quot;list&quot;);
    }&lt;/pre&gt;

&lt;p&gt;Jak widać, odpowiedź, a właściwie jej część znajdująca się pod kluczem „list”, przenoszona jest do tablicy JSONowej.&lt;/p&gt;

&lt;p&gt;Jak już mam tablicę, to mogę wyciągnąć z niej np. opis pogody znajdujący się pod konkretnym indeksem w zależności od tego, z którego dnia interesuje mnie pogoda.&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
public String getDescription(int arrayIndex) {
        return allDataJsonArray.getJSONObject(arrayIndex)
                .getJSONArray(&quot;weather&quot;)
                .getJSONObject(0)
                .getString(&quot;description&quot;);
    }&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Postanowiłem zrobić coś takiego:&lt;/p&gt;

&lt;p&gt;najpierw dodałem bibliotekę WireMock, następnie ustawiłem odpowiednio pod adnotacjami&amp;nbsp;&lt;em&gt;BeforeEach&lt;/em&gt;&amp;nbsp;i &lt;em&gt;AfterEach&lt;/em&gt;&amp;nbsp;uruchamianie i zatrzymywanie wirtualnego hosta.&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
   @BeforeEach
    void setup() {
        wireMockServer = new WireMockServer(8090);
        wireMockServer.start();
        setupStub();
    }

    @AfterEach
    void teardown() {
        wireMockServer.stop();
    }&lt;/pre&gt;

&lt;p&gt;Stub ustawiany w metodzie&amp;nbsp;&lt;em&gt;setup&lt;/em&gt;&amp;nbsp;prezentuje się w sposób następujący:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
private void setupStub() {
        wireMockServer.stubFor(get(urlEqualTo(ENDPOINT))
                .willReturn(aResponse().withHeader(&quot;Content-Type&quot;, &quot;text/plain&quot;)
                        .withStatus(200)
                        .withBodyFile(&quot;json/&quot; + API_RESPONSE_EXAMPLE_FILE_NAME)));
    }&lt;/pre&gt;

&lt;p&gt;Odwołuje się on do gotowego pliku JSON z przykładową odpowiedzią z serwera:&lt;/p&gt;

&lt;pre class=&quot;brush:jscript;&quot;&gt;
{
    &quot;cod&quot;: &quot;200&quot;,
    &quot;message&quot;: 0,
    &quot;cnt&quot;: 40,
    &quot;list&quot;: [
        {
            &quot;dt&quot;: 1630670400,
            &quot;main&quot;: {
                &quot;temp&quot;: 19.48,
                &quot;feels_like&quot;: 18.87,
                &quot;temp_min&quot;: 19.48,
                &quot;temp_max&quot;: 21.31,
                &quot;pressure&quot;: 1017,
                &quot;sea_level&quot;: 1017,
                &quot;grnd_level&quot;: 1002,
                &quot;humidity&quot;: 53,
                &quot;temp_kf&quot;: -1.83
            },
            &quot;weather&quot;: [
                {
                    &quot;id&quot;: 801,
                    &quot;main&quot;: &quot;Clouds&quot;,
itp. itd.&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;No i teraz pojawia się pytanie: jak i czy w ogóle da się tak zrobić, żeby metoda&amp;nbsp;&lt;em&gt;connectToApi&lt;/em&gt;&amp;nbsp;łączyła się z localhostem? Próbowałem przy pomocy&amp;nbsp;&lt;em&gt;given&lt;/em&gt;...&amp;nbsp;&lt;em&gt;willReturn&lt;/em&gt;&amp;nbsp;ustawić metody&amp;nbsp;&lt;em&gt;getMainApiPart&lt;/em&gt;, &lt;em&gt;getAdditionalApiPart&lt;/em&gt; i &lt;em&gt;getApiKey&lt;/em&gt;, żeby zwracały składowe localhosta, ale to nic nie dało i kod odpowiedzi wyniósł 0, a sama odpowiedź zamiast JSONa była nullem.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Może powinienem jakoś przerobić metodę&amp;nbsp;&lt;em&gt;connectToApi&lt;/em&gt;, żeby kod był bardziej albo nawet w ogóle testowalny? Jeśli tak, to jak na przykład?&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Jakieś pomysły?&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Całość kodu znajduje się pod tym linkiem —&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/suabicii/jfx-weather&quot;&gt;https://github.com/suabicii/jfx-weather&lt;/a&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=591/java-jak-zamockowa%C4%87-po%C5%82%C4%85czenie-z-api</guid>
<pubDate>Thu, 16 Sep 2021 14:44:40 +0000</pubDate>
</item>
<item>
<title>JavaFX — ładowanie danych z API w tle i trzy wersje na trzy systemy zamiast jednej</title>
<link>http://forum.przyszlyprogramista.pl/?qa=565/javafx-%C5%82adowanie-danych-trzy-wersje-systemy-zamiast-jednej</link>
<description>&lt;p&gt;Zanim zaimplementuję testy w swojej aplikacji pogodowej, chciałbym poprawić parę rzeczy. Jedną z nich jest wykonanie operacji pobrania danych pogodowych z API. Niestety problem polega na tym, że gdy ta operacja się wykonuje, program na chwilę się zawiesza. Wiem, że coś z serwisami trzeba pokombinować, ale po przerobieniu przysłowiowego „zyliona” tutoriali mam ogromny mętlik w głowie i dalej nie wiem jak takie „cudo” zaimplementować.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Oto kod, który ma „niby” zadziałać w tle:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
private void updateWeatherData(Runnable runnable) {
        Service&amp;lt;Void&amp;gt; service = new Service&amp;lt;&amp;gt;() {
            @Override
            protected Task&amp;lt;Void&amp;gt; createTask() {
                return new Task&amp;lt;&amp;gt;() {
                    @Override
                    protected Void call() throws InterruptedException {
                        Thread.sleep(1500);
                        Platform.runLater(runnable);
                        return null;
                    }
                };
            }
        };
        progressIndicator1.visibleProperty().bind(service.runningProperty());
        progressIndicator2.visibleProperty().bind(service.runningProperty());
        service.start();
    }&lt;/pre&gt;

&lt;p&gt;W czasie, gdy dane będą pobierane do odpowiednich kontrolek, powinny kręcić się dwa kółka ładowania (progress indicatory). Powinna również być możliwość kliknięcia na jakąkolwiek opcję menu. Niestety żadna z wymienionych rzeczy się nie dzieje. No może na początku kółka się kręcą, a potem stoją w miejscu.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thread.sleep(1500)&lt;/em&gt;&amp;nbsp;użyłem, żeby okno aplikacji wyświetliło się po uruchomieniu i trochę po to, aby częściowo „oszukać” zwykłego (tzn. nietechnicznego) użytkownika, że coś się ładuje. W przeciwnym wypadku zanim pokaże się okno programu,&amp;nbsp;trzeba czekać aż dane zostaną załadowane do wszystkich kontrolek.&lt;/p&gt;

&lt;p&gt;Jak nie owrapuję metod&amp;nbsp;aktualizujących&amp;nbsp;zawartość kontrolek przy pomocy&amp;nbsp;&lt;em&gt;Platform.runLater&lt;/em&gt;, tylko wywołam bezpośrednio w metodzie&amp;nbsp;&lt;em&gt;call&lt;/em&gt;,&amp;nbsp;to program wywali mi błąd&amp;nbsp;&lt;em&gt;Not on FX application thread&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Runnable wykonywane w&amp;nbsp;&lt;em&gt;Platform.runLater&lt;/em&gt;&amp;nbsp;to:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
private final Runnable getWeatherInFirstCityRunnable = MainWindowController.this::getWeatherInFirstCity;
private final Runnable getWeatherInSecondCityRunnable = MainWindowController.this::getWeatherInSecondCity;&lt;/pre&gt;

&lt;p&gt;Natomiast funkcje przypisane do tych Runnable:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
private void getWeatherInFirstCity() {
      currentWeatherCityOneController.showWeatherData(getCityName(cityOneChoiceBox));
    forecastCityOneController.showWeatherData(getCityName(cityOneChoiceBox));
}

private void getWeatherInSecondCity() {
    currentWeatherCityTwoController.showWeatherData(getCityName(cityTwoChoiceBox));
    forecastCityTwoController.showWeatherData(getCityName(cityTwoChoiceBox));
}&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Kolejna sprawa, która mnie niepokoi, to uruchamianie aplikacji na różnych systemach, a konkretnie: na Windowsie i Maku aplikacja powinna się odpalić poprzez dwukrotne kliknięcie pliku jar albo chociaż przez wywołanie polecenia:&lt;/p&gt;

&lt;pre class=&quot;brush:bash;&quot;&gt;
java -jar nazwa_pliku.jar&lt;/pre&gt;

&lt;p&gt;Niestety ta powyższa komenda działa tylko i wyłącznie na Linuksie. Na pozostałych systemach trzeba w poleceniu umieścić&amp;nbsp;&lt;em&gt;--module-path&amp;nbsp;&lt;/em&gt;i ścieżkę do bibliotek JavyFX oraz&amp;nbsp;&lt;em&gt;--add-modules&lt;/em&gt;&amp;nbsp;i wymienić odpowiednie moduły, czyli wtedy polecenie musi wyglądać&amp;nbsp;tak:&lt;/p&gt;

&lt;pre class=&quot;brush:bash;&quot;&gt;
java --module-path ścieżka --add-modules javafx.controls,javafx.fxml,javafx.graphics -jar nazwa_pliku.jar&lt;/pre&gt;

&lt;p&gt;Żeby użytkownik nie musiał wywoływać tak długiej komendy, wygenerowałem w C++ plik exe dla Windowsa, który automatycznie wywołuje ww. polecenie i skrypt&amp;nbsp;dla Maka robiący to samo, który napisałem w Bashu.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Zgodnie z zaleceniami naszego Javovego eksperta, W. Cz. Marcina, obok głównej klasy uruchamiającej aplikację:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.michaelslabikovsky;

import javafx.application.Application;
import javafx.stage.Stage;
import pl.michaelslabikovsky.view.ViewFactory;

public class Launcher extends Application {

    @Override
    public void start(Stage stage) {
        ViewFactory viewFactory = new ViewFactory();
        viewFactory.showMainWindow();
    }

    public static void main(String[] args) {
        launch(args);
    }

}&lt;/pre&gt;

&lt;p&gt;utworzyłem oddzielną klasę, która w swojej metodzie&amp;nbsp;&lt;em&gt;main&lt;/em&gt;&amp;nbsp;wywołuje z argumentami metodę&amp;nbsp;&lt;em&gt;main&lt;/em&gt;&amp;nbsp;klasy głównej, czyli w moim przypadku&amp;nbsp;&lt;em&gt;Launcher&lt;/em&gt;:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.michaelslabikovsky;

public class StarterApp {
    public static void main(String[] args) {
        Launcher.main(args);
    }
}
&lt;/pre&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Dodatkowo dodałem&amp;nbsp;&lt;em&gt;maven-shade-plugin&lt;/em&gt;&amp;nbsp;do&amp;nbsp;&lt;em&gt;pom.xml:&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
&amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-shade-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.2.4&amp;lt;/version&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;shade&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                        &amp;lt;configuration&amp;gt;
                            &amp;lt;transformers&amp;gt;
                                &amp;lt;transformer implementation=&quot;org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&quot;&amp;gt;
                                    &amp;lt;mainClass&amp;gt;pl.michaelslabikovsky.StarterApp&amp;lt;/mainClass&amp;gt;
                                &amp;lt;/transformer&amp;gt;
                            &amp;lt;/transformers&amp;gt;
                        &amp;lt;/configuration&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
        &amp;lt;/plugin&amp;gt;&lt;/pre&gt;

&lt;p&gt;Coś pominąłem?&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Całość kodu źródłowego można znaleźć pod tym linkiem&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/suabicii/jfx-weather&quot;&gt;https://github.com/suabicii/jfx-weather&lt;/a&gt;, natomiast tutaj&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/suabicii/jfx-weather/releases&quot;&gt;https://github.com/suabicii/jfx-weather/releases&lt;/a&gt;&amp;nbsp;znajdują się paczki z wyrenderowaną aplikacją do uruchomienia.&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=565/javafx-%C5%82adowanie-danych-trzy-wersje-systemy-zamiast-jednej</guid>
<pubDate>Wed, 01 Sep 2021 13:47:14 +0000</pubDate>
</item>
<item>
<title>Openweathermap - parsowanie jsona</title>
<link>http://forum.przyszlyprogramista.pl/?qa=526/openweathermap-parsowanie-jsona</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Zdarzyło się komuś parsować jsona w formie listy? Potrzebne mi to do wyświetlania prognozy na kilka kolejnych dni, jak na razie znalazłem jedynie poradniki jak parsować jsona w formie tabeli. Będę wdzięczny za wszelką pomoc.</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=526/openweathermap-parsowanie-jsona</guid>
<pubDate>Thu, 05 Aug 2021 07:55:43 +0000</pubDate>
</item>
<item>
<title>JavaFX - stylizowanie</title>
<link>http://forum.przyszlyprogramista.pl/?qa=504/javafx-stylizowanie</link>
<description>Cześć wszystkim,&lt;br /&gt;
&lt;br /&gt;
Chciałem zapytać o drobną rzecz związana ze stylizowaniem w JavaFX. Zauważyłem, że są 3 sposoby stylizowania: bezpośrednio w kodzie, za pomocą wczytywania plików .css oraz w SceneBuilderze. Zakładem, że mieszanie sposobów stylizowania w jednej aplikacji nie jest najlepszym pomysłem. Tak więc chciałem Was zapytać, który sposób preferujecie/uważacie za najlepszy? Oraz zakładając, że ktoś uparł się, żeby pomieszać te style, który z nich ma największy priorytet?</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=504/javafx-stylizowanie</guid>
<pubDate>Sat, 31 Jul 2021 18:16:03 +0000</pubDate>
</item>
<item>
<title>Klient Pocztowy - javax.net.ssl.SSLHandshakeException</title>
<link>http://forum.przyszlyprogramista.pl/?qa=503/klient-pocztowy-javax-net-ssl-sslhandshakeexception</link>
<description>Mam problem przy tworzeniu klienta pocztowego. Wyskakuje mi następujący wyjątek: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target&lt;br /&gt;
&lt;br /&gt;
Może ktoś z Was miał podobny problem i mógłby pomóc?</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=503/klient-pocztowy-javax-net-ssl-sslhandshakeexception</guid>
<pubDate>Sat, 31 Jul 2021 08:37:16 +0000</pubDate>
</item>
<item>
<title>JavaFX - problem z czcionką tylko w systemie Windows</title>
<link>http://forum.przyszlyprogramista.pl/?qa=485/javafx-problem-z-czcionk%C4%85-tylko-w-systemie-windows</link>
<description>&lt;p&gt;Kończę pracę nad aplikacją pogodową i jedyne, co mi zostało, to czcionka&amp;nbsp;(nie licząc paru bugów, które wydaje mi się, że nie zaburzają pracy programu, tylko konsola „krzyczy”, że coś może być nie tak). Chodzi dokładnie o to, że w niektórych miejscach wyświetlają się „krzaczki” zamiast polskich znaków. Niestety wyczerpały mi się pomysły, jak pozbyć się tego problemu.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
Najlepsze jest to, że ten problem występuje&amp;nbsp;&lt;strong&gt;tylko i wyłącznie na Windowsie&amp;nbsp;&lt;/strong&gt;(10, gdyby ktoś pytał o wersję). Program uruchamiałem na Linuksie Ubuntu 20.04 (gdzie był przeze mnie tworzony) i MacOS-ie Big Sur i tam nie było problemu z wczytaniem polskich znaków. Tylko na tym drugim na początku były wszędzie „krzaczki”, ale gdy zmieniłem czcionkę na&amp;nbsp;&lt;em&gt;sans-serif&lt;/em&gt;, problem został usunięty... no prawie, bo nie udało mi się pozbyć „krzaczków” z okna dialogowego, w którym zawarłem informacje o programie&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;. Niestety taki zabieg w ogóle nic nie dał na systemie Windows. Próbowałem również innych czcionek (już nawet nie pamiętam jakich, bo trochę ich było) i nadal to samo.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Tak wygląda moja aplikacja na Windowsie:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;jfx-weather-windows&quot; src=&quot;https://i.ibb.co/31kQ3vL/jfx-weather-windows.png&quot; style=&quot;height:600px; width:583px&quot;&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Natomiast na Linuksie i Macu prezentuje się w taki oto sposób:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;jfx-weather-linux-mac&quot; src=&quot;https://i.ibb.co/K6HF8Y2/jfx-weather-linux.png&quot; style=&quot;height:600px; width:579px&quot;&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Projekt na GH:&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/suabicii/jfx-weather&quot;&gt;https://github.com/suabicii/jfx-weather&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Tutaj jeszcze zamieszczam plik &lt;em&gt;.env&lt;/em&gt;&amp;nbsp;z kluczem API&amp;nbsp;&lt;a rel=&quot;nofollow&quot; href=&quot;https://drive.google.com/file/d/1d_MS4xF6oRQmk825Ybtvyso0rOrZeSv3/view?usp=sharing&quot;&gt;&amp;lt;klik&amp;gt;&lt;/a&gt; wygenerowanym specjalnie dla osób trzecich&amp;nbsp;z „nieoficjalnego” konta na&amp;nbsp;&lt;em&gt;openweathermap.org&lt;/em&gt;. Tego oficjalnego używam tylko do wersji produkcyjnej aplikacji.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Ktoś ma jakiś pomysł, jak definitywnie pozbyć się „krzaczków”? O ile w ogóle się da&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;.&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=485/javafx-problem-z-czcionk%C4%85-tylko-w-systemie-windows</guid>
<pubDate>Wed, 28 Jul 2021 11:53:23 +0000</pubDate>
</item>
<item>
<title>JavaFx - problemy z uruchomieniem aplikacji</title>
<link>http://forum.przyszlyprogramista.pl/?qa=481/javafx-problemy-z-uruchomieniem-aplikacji</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Ledwie zacząłem pracować nad swoją aplikacją pogodową, jednak napotkałem już pewnie problemy. Mianowicie, co chwila program nie chce się włączyć, wyświetlając errory od 'Exception in Application start method'. Czy ktoś miał podobny problem z odpalaniem aplikacji i jakoś się z nim uporał?&lt;br /&gt;
&lt;br /&gt;
Z góry dzięki,&lt;br /&gt;
&lt;br /&gt;
Filip</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=481/javafx-problemy-z-uruchomieniem-aplikacji</guid>
<pubDate>Mon, 26 Jul 2021 12:01:43 +0000</pubDate>
</item>
<item>
<title>JavaFx — problem z wyświetlaniem danych z API w oknie aplikacji</title>
<link>http://forum.przyszlyprogramista.pl/?qa=404/javafx-problem-z-wy%C5%9Bwietlaniem-danych-api-oknie-aplikacji</link>
<description>&lt;p&gt;Witam serdecznie&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;.&lt;/p&gt;

&lt;p&gt;Zmagań z JavąFx i aplikacją pogodową ciąg dalszy. Jak w temacie, gdy program pobiera dane pogodowe z API, to niby zawartość labeli, które te dane mają wyświetlić jest&amp;nbsp;aktualizowana&amp;nbsp;(co łatwo można sprawdzić przy pomocy&amp;nbsp;&lt;em&gt;System.out.println&lt;/em&gt;), jednak w oknie aplikacji tego nie widać.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Program działał dopóki nie zacząłem podejmować prób refaktoryzacji. Przed refaktoryzacją kontroler przypisany do głównego okna wyglądał następująco:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.michaelslabikovsky.controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import org.json.JSONArray;
import pl.michaelslabikovsky.WeatherManager;
import pl.michaelslabikovsky.model.WeatherData;
import pl.michaelslabikovsky.utils.JSONConverter;
import pl.michaelslabikovsky.view.ViewFactory;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class MainWindowController extends BaseController implements Initializable {

//    NEED REFACTOR HERE

    @FXML
    private ChoiceBox&amp;lt;String&amp;gt; cityOneChoiceBox;

    @FXML
    private ChoiceBox&amp;lt;String&amp;gt; cityTwoChoiceBox;

    @FXML
    private ImageView currentWeatherCityOneImg;

    @FXML
    private ImageView currentWeatherCityTwoImg;

    @FXML
    private Label currentWeatherResultCityOne;

    @FXML
    private Label currentTemperatureCityOne;

    @FXML
    private Label currentPressureCityOne;

    @FXML
    private Label currentWindSpeedCityOne;

    @FXML
    private Label currentWeatherResultCityTwo;

    @FXML
    private Label currentTemperatureCityTwo;

    @FXML
    private Label currentHumidityCityOne;

    @FXML
    private Label currentPressureCityTwo;

    @FXML
    private Label currentWindSpeedCityTwo;

    @FXML
    private Label currentHumidityCityTwo;

    private WeatherData weatherData;

    public MainWindowController(WeatherManager weatherManager, ViewFactory viewFactory, String fxmlName) {
        super(weatherManager, viewFactory, fxmlName);
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        cityOneChoiceBox.getItems().addAll(&quot;Warszawa&quot;, &quot;Dodaj miejscowość...&quot;);
        cityTwoChoiceBox.getItems().addAll(&quot;Londyn&quot;, &quot;Dodaj miejscowość...&quot;);
        cityOneChoiceBox.getSelectionModel().selectFirst();
        cityTwoChoiceBox.getSelectionModel().selectFirst();

        cityOneChoiceBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -&amp;gt; addCity(cityOneChoiceBox, oldValue));

        cityTwoChoiceBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -&amp;gt; addCity(cityTwoChoiceBox, oldValue));

        showWeatherData();
    }

    public void showWeatherData() {
        try {
            getCurrentWeather(&quot;Warszawa&quot;, currentWeatherResultCityOne, currentTemperatureCityOne, currentPressureCityOne, currentWindSpeedCityOne, currentHumidityCityOne, currentWeatherCityOneImg);
            getCurrentWeather(&quot;Londyn&quot;, currentWeatherResultCityTwo, currentTemperatureCityTwo, currentPressureCityTwo, currentWindSpeedCityTwo, currentHumidityCityTwo, currentWeatherCityTwoImg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void getCurrentWeather(String cityName, Label weatherLabel, Label temperatureLabel, Label pressureLabel, Label windSpeedLabel, Label humidityLabel, ImageView weatherIcon) throws IOException {
        weatherData = new WeatherData(cityName);
        String weatherDataResult = weatherData.getResult();
        JSONArray jsonArray = JSONConverter.convertStringObjectToJSONArray(weatherDataResult);
        weatherLabel.setText(jsonArray.getJSONObject(0).getJSONArray(&quot;weather&quot;).getJSONObject(0).getString(&quot;description&quot;));
        temperatureLabel.setText(String.valueOf(jsonArray.getJSONObject(1).getJSONObject(&quot;main&quot;).getInt(&quot;temp&quot;)) + &quot;°C&quot;);
        pressureLabel.setText(String.valueOf(jsonArray.getJSONObject(1).getJSONObject(&quot;main&quot;).getInt(&quot;pressure&quot;)) + &quot; hPa&quot;);
        windSpeedLabel.setText(String.valueOf(jsonArray.getJSONObject(1).getJSONObject(&quot;wind&quot;).getDouble(&quot;speed&quot;)) + &quot; m/s&quot;);
        humidityLabel.setText(String.valueOf(jsonArray.getJSONObject(1).getJSONObject(&quot;main&quot;).getInt(&quot;humidity&quot;)) + &quot;%&quot;);
        weatherIcon.setImage(setImageUrl(getIconUrl(jsonArray)));
    }

    private String getIconUrl(JSONArray jsonArray) {
        String weatherIconId = jsonArray.getJSONObject(0).getJSONArray(&quot;weather&quot;).getJSONObject(0).getString(&quot;icon&quot;);
        return &quot;https://openweathermap.org/img/wn/&quot; + weatherIconId + &quot;@2x.png&quot;;
    }

    private void addCity(ChoiceBox&amp;lt;String&amp;gt; cityChoiceBox, Number oldValue) {
        if (cityChoiceBox.getSelectionModel().getSelectedIndex() == cityChoiceBox.getItems().size() - 1) {
            cityChoiceBox.getSelectionModel().select(oldValue.intValue());
        }
    }

    private Image setImageUrl(String url) {
        return new Image(url);
    }
}&lt;/pre&gt;

&lt;p&gt;Prawda, że nie wygląda to najlepiej?&amp;nbsp;&lt;img alt=&quot;indecision&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/whatchutalkingabout_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;indecision&quot;&gt;&amp;nbsp;Zwłaszcza ilość pól. A co, jeśli dojdzie do tego prognoza na najbliższych 5 dni? Dlatego postanowiłem zrefaktoryzować&amp;nbsp;kod&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;. Najlepsze jest to, że przed próbą optymalizacji kodu apka działała normalnie, tzn. dane pogodowe były widoczne w oknie, co pozwolę sobie przedstawić na poniższym screenie.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://drive.google.com/file/d/1_revhiwCiTfChAcu6oun0UsrsRxNgTfc/view?usp=sharing&quot;&gt;&lt;img alt=&quot;Apka działa&quot; src=&quot;https://i.ibb.co/DzFLLxX/Apka-pogodowa-dzia-a.png&quot; style=&quot;height:600px; width:675px&quot;&gt;&lt;em&gt;MainController&lt;/em&gt;&amp;nbsp;po zmianie:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.michaelslabikovsky.controller;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ChoiceBox;
import pl.michaelslabikovsky.WeatherManager;
import pl.michaelslabikovsky.controller.currentweather.CurrentWeatherCityOneController;
import pl.michaelslabikovsky.controller.currentweather.CurrentWeatherCityTwoController;
import pl.michaelslabikovsky.controller.currentweather.CurrentWeatherController;
import pl.michaelslabikovsky.view.ViewFactory;

import java.net.URL;
import java.util.ResourceBundle;

public class MainWindowController extends BaseController implements Initializable {

    @FXML
    private ChoiceBox&amp;lt;String&amp;gt; cityOneChoiceBox;

    @FXML
    private ChoiceBox&amp;lt;String&amp;gt; cityTwoChoiceBox;

    private CurrentWeatherController currentWeatherCityOneController = new CurrentWeatherCityOneController();

    private CurrentWeatherController currentWeatherCityTwoController = new CurrentWeatherCityTwoController();

    public MainWindowController(WeatherManager weatherManager, ViewFactory viewFactory, String fxmlName) {
        super(weatherManager, viewFactory, fxmlName);
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        cityOneChoiceBox.getItems().addAll(&quot;Warszawa&quot;, &quot;Dodaj miejscowość...&quot;);
        cityTwoChoiceBox.getItems().addAll(&quot;Londyn&quot;, &quot;Dodaj miejscowość...&quot;);
        cityOneChoiceBox.getSelectionModel().selectFirst();
        cityTwoChoiceBox.getSelectionModel().selectFirst();

        cityOneChoiceBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -&amp;gt; addCity(cityOneChoiceBox, oldValue));
        cityTwoChoiceBox.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -&amp;gt; addCity(cityTwoChoiceBox, oldValue));

        new Thread(() -&amp;gt; currentWeatherCityOneController.showWeatherData()).start();
        new Thread(() -&amp;gt; currentWeatherCityTwoController.showWeatherData()).start();
    }

    private void addCity(ChoiceBox&amp;lt;String&amp;gt; cityChoiceBox, Number oldValue) {
        if (cityChoiceBox.getSelectionModel().getSelectedIndex() == cityChoiceBox.getItems().size() - 1) {
            cityChoiceBox.getSelectionModel().select(oldValue.intValue());
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Logikę odpowiadającą za pobieranie danych dotyczących aktualnej pogody przeniosłem do dwóch oddzielnych kontrolerów:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.michaelslabikovsky.controller.currentweather;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;

import java.io.IOException;

public class CurrentWeatherCityOneController extends CurrentWeatherController {

    @FXML
    private ImageView currentWeatherCityOneImg;

    @FXML
    private Label currentWeatherResultCityOne;

    @FXML
    private Label currentTemperatureCityOne;

    @FXML
    private Label currentPressureCityOne;

    @FXML
    private Label currentWindSpeedCityOne;

    @FXML
    private Label currentHumidityCityOne;

    public CurrentWeatherCityOneController() {
        currentWeatherCityOneImg = new ImageView();
        currentWeatherResultCityOne = new Label();
        currentTemperatureCityOne = new Label();
        currentPressureCityOne = new Label();
        currentWindSpeedCityOne = new Label();
        currentHumidityCityOne = new Label();
    }

    @Override
    public void showWeatherData() {
        try {
            getCurrentWeather(&quot;Warszawa&quot;, currentWeatherResultCityOne, currentTemperatureCityOne, currentPressureCityOne, currentWindSpeedCityOne, currentHumidityCityOne, currentWeatherCityOneImg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
&lt;/pre&gt;

&lt;p&gt;Drugi wygląda niemal identycznie.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;W tym przypadku okno aplikacji wygląda tak:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Apka nie działa&quot; src=&quot;https://i.ibb.co/GWykKCP/Apka-pogodowa-nie-dzia-a.png&quot; style=&quot;height:600px; width:675px&quot;&gt;&lt;/p&gt;

&lt;p&gt;Resztę kodu znajdziecie pod tym adresem:&amp;nbsp;&lt;a href=&quot;https://github.com/suabicii/jfx-weather/tree/refactor_current-weather-default-locations&quot; rel=&quot;nofollow&quot;&gt;https://github.com/suabicii/jfx-weather/tree/refactor_current-weather-default-locations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Ma ktoś jakiś pomysł, dlaczego wcześniej działało, a teraz nie działa i co z tym fantem zrobić?&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uwaga!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aby kod z GitHuba poprawnie się kompilował, należy założyć konto lub się zalogować na tej stronie:&amp;nbsp;&lt;a href=&quot;https://home.openweathermap.org/users/sign_in&quot; rel=&quot;nofollow&quot;&gt;https://home.openweathermap.org/users/sign_in&lt;/a&gt;, następnie wygenerować klucz API, utworzyć w głównym folderze projektu plik&amp;nbsp;&lt;em&gt;.env&lt;/em&gt;, a w nim dodać linię&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;
API_KEY=wygenerowany_klucz&lt;/pre&gt;

&lt;p&gt;i skopiować wygenerowany klucz tam, gdzie wpisałem&amp;nbsp;&lt;em&gt;wygenerowany_klucz&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Będę bardzo wdzięczny za pomoc&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=404/javafx-problem-z-wy%C5%9Bwietlaniem-danych-api-oknie-aplikacji</guid>
<pubDate>Fri, 25 Jun 2021 12:45:03 +0000</pubDate>
</item>
<item>
<title>Maven i JavaFX w IntellijIDEA sieje błędami</title>
<link>http://forum.przyszlyprogramista.pl/?qa=375/maven-i-javafx-w-intellijidea-sieje-b%C5%82%C4%99dami</link>
<description>&lt;p&gt;Cześć,&lt;/p&gt;

&lt;p&gt;Chcę ustawić sobie środowisko pod kurs Javy, w którym buduję klienta pocztowego. Po stworzeniu struktury katalogów póki nie używam klasy FXMLLoader wszystko działa, natomiast gdy chcę użyć layoutu w oparciu o fxml przy próbie uruchomienia programu dostaję litanię błędów jak poniżej&lt;/p&gt;

&lt;pre class=&quot;brush:bash;&quot;&gt;
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException: Location is required.
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230)
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
	at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
	at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
	at MyMailClient/pl.wojciechsiwek.Launcher.start(Launcher.java:19)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	... 1 more
Exception running application pl.wojciechsiwek.Launcher&lt;/pre&gt;

&lt;p&gt;Przegrzebałem internety w poszukiwaniu rozwiązania bo wiem, że to nie jest tylko mój problem i były sugestie odnośnie niepoprawnej ścieżki do pliku fxml. Po wielu próbach modyfikacji ścieżki poległem i nie wiem jak dalej ruszyć z tematem.&lt;/p&gt;

&lt;p&gt;Poniżej podaję zawartość moich plików:&lt;/p&gt;

&lt;p&gt;pom.xml&lt;/p&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;pl.wojciechsiwek&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;MyMailClient&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt;
        &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt;
    &amp;lt;/properties&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;11&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;11&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;Launcher.java&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package pl.wojciechsiwek;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;
import java.util.Objects;

public class Launcher extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws IOException {
        Parent parent;
        parent = FXMLLoader.load(Objects.requireNonNull(getClass().getResource(&quot;view/testView.fxml&quot;)));

        Scene scene = new Scene(parent);

        stage.setScene(scene);
        stage.show();
    }
}
&lt;/pre&gt;

&lt;p&gt;module.info&lt;/p&gt;

&lt;pre class=&quot;brush:bash;&quot;&gt;
module MyMailClient {
    requires javafx.controls;
    requires javafx.fxml;

    opens pl.wojciechsiwek;
    opens pl.wojciechsiwek.view;
}&lt;/pre&gt;

&lt;p&gt;no i drzewko mojego projektu&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Zrzut projektu&quot; src=&quot;https://wojciechsiwek.pl/zrzut.png&quot; style=&quot;height:525px; width:363px&quot;&gt;&lt;/p&gt;

&lt;p&gt;Może macie sugestie co mogło tutaj pójść nie tak? Dodam, że próbowałem wielu różnych wersji FXML i javaFX a także JDK i bezskutecznie. Dodam, że w takim środowisku ładnie uruchamiają się aplikacje pisane bez użycia FXML.&lt;/p&gt;

&lt;p&gt;Z góry dzięki za podpowiedzi i pochylenie się nad moim problemem. :)&lt;/p&gt;

&lt;p&gt;Pozdrawiam Was serdecznie,&lt;/p&gt;

&lt;p&gt;Wojtek&lt;/p&gt;

&lt;p&gt;Edit 1:&lt;/p&gt;

&lt;p&gt;poniżej link do zdalnego repozytorium:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/wojtex77/MyMailClient.git&quot; rel=&quot;nofollow&quot;&gt;https://github.com/wojtex77/MyMailClient.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;dodam że korzystam z IntelliJ IDEA 2021.1.1 (Community Edition)&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=375/maven-i-javafx-w-intellijidea-sieje-b%C5%82%C4%99dami</guid>
<pubDate>Tue, 15 Jun 2021 19:26:37 +0000</pubDate>
</item>
<item>
<title>Aplikacja pogodowa - wyświetlanie pogody na kolejne dni</title>
<link>http://forum.przyszlyprogramista.pl/?qa=271/aplikacja-pogodowa-wy%C5%9Bwietlanie-pogody-na-kolejne-dni</link>
<description>Hej!&lt;br /&gt;
&lt;br /&gt;
Od jakiegoś czasu pracuję nad aplikacją pogodową, z którą mam póki co najwięcej trudności w porównaniu do dotychczasowych projektów. Jestem na etapie wyświetlania danych tzn. mam dane pogodowe pobrane do odpowiednich zmiennych i potrzebuje je wyświetlić w jakiś sensowny sposób.&lt;br /&gt;
&lt;br /&gt;
Nie chcę tworzyć gotowych pól pod każdy dzień w głównym oknie, czekających na wprowadzenie danych, bo to brzmi jak syzyfowa praca. Zamiast tego wolałbym stworzyć jakiś obiekt, preset przy którego tworzeniu podawałbym dane w konstruktorze, a sam obiekt wrzucał do jakiegoś Pane'a. A więc oto pytanie:&lt;br /&gt;
&lt;br /&gt;
Czy da się zrobić jakiś preset fxml, którego instancję z odpowiednimi danymi wrzucało by się z poziomu kodu do np. Hboxa? Odniesienie do tego obiektu nie jest potem potrzebne, ponieważ w przypadku odświeżania wystarczyłoby wyczyścić Hboxa. Wydaje mi się to najbardziej sensownym rozwiązaniem, ale nie bardzo wiem jak to wykonać.&lt;br /&gt;
&lt;br /&gt;
Ewentualnie, czy znacie może jakieś lepsze rozwiązanie, które można wykorzystać? &lt;br /&gt;
&lt;br /&gt;
Pozdrawiam,&lt;br /&gt;
Artur</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=271/aplikacja-pogodowa-wy%C5%9Bwietlanie-pogody-na-kolejne-dni</guid>
<pubDate>Thu, 20 May 2021 12:24:04 +0000</pubDate>
</item>
<item>
<title>Failed to execute goal org.openjfx:javafx-maven-plugin:0.0.4:run</title>
<link>http://forum.przyszlyprogramista.pl/?qa=222/failed-to-execute-goal-org-openjfx-javafx-maven-plugin-0-run</link>
<description>&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;jestem na etapie tworzenia w Javie aplikacji pogodowej i jak na razie zatrzymałem się na wstępnej wersji layoutu. Aby lepiej zrozumieć JavęFX postanowiłem trochę się podszkolić z tego tutoriala&lt;a href=&quot;https://www.youtube.com/watch?v=rEzzJaoC6uo&amp;amp;list=PLpzwMkmxJDUwQuQR7Rezut5UE_8UGDxkU&quot; rel=&quot;nofollow&quot;&gt;&amp;nbsp;https://www.youtube.com/watch?v=rEzzJaoC6uo&amp;amp;list=PLpzwMkmxJDUwQuQR7Rezut5UE_8UGDxkU&lt;/a&gt;, abym wreszcie mógł ruszyć z miejsca i zaimplementować logikę (nie wspominając o ulepszeniu layoutu&amp;nbsp;&lt;img alt=&quot;wink&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/wink_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;wink&quot;&gt;)&lt;/p&gt;

&lt;p&gt;Żeby zbytnio nie psuć swojego projektu, utworzyłem nowy projekt, świeży, przy pomocy Mavena wg dokumentacji w dziale&amp;nbsp;&lt;em&gt;JavaFX and&lt;/em&gt;&amp;nbsp;&lt;em&gt;IntelliJ —&amp;gt; Modular with Maven&amp;nbsp;&lt;/em&gt;&lt;a href=&quot;https://openjfx.io/openjfx-docs/&quot; rel=&quot;nofollow&quot;&gt;https://openjfx.io/openjfx-docs/&lt;/a&gt;. Podobnie zrobiłem z aplikacją pogodową, z tym że pliki odpowiedzialne za widoki i kontrolery umieściłem w osobnych paczkach (w podobny sposób, jak postąpił z projektem autor kursu na Udemy o JavieFX tworząc klienta poczty)&lt;/p&gt;

&lt;p&gt;Wszystko ładnie pięknie, projekt&amp;nbsp;prawidłowo się&amp;nbsp;kompiluje, jednak gorzej z uruchomieniem&amp;nbsp;&lt;img alt=&quot;sad&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/sad_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;sad&quot;&gt;. Gdy próbuję wykonać&amp;nbsp;&lt;em&gt;javafx:run&lt;/em&gt;&amp;nbsp;wyskakuje mi poniższy komunikat:&lt;/p&gt;

&lt;pre class=&quot;brush:bash;&quot;&gt;
Failed to execute goal org.openjfx:javafx-maven-plugin:0.0.4:run (default-cli) on project javaFxKurs: Error&lt;/pre&gt;

&lt;p&gt;Oto zawartość pliku&amp;nbsp;&lt;em&gt;pom.xml&lt;/em&gt;:&lt;/p&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;javaFxKurs&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;properties&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
        &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt;
        &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt;
    &amp;lt;/properties&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-controls&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;11.0.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;javafx-fxml&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;11.0.2&amp;lt;/version&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;release&amp;gt;11&amp;lt;/release&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.openjfx&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;javafx-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;0.0.4&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;mainClass&amp;gt;org.example.App&amp;lt;/mainClass&amp;gt;
                    &amp;lt;executable&amp;gt;/usr/lib/jvm/jdk-11.0.10/bin/java&amp;lt;/executable&amp;gt;
                &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;Plik&amp;nbsp;&lt;em&gt;App.java&lt;/em&gt;&amp;nbsp;— klasa główna:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package org.example;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML(&quot;primary&quot;), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }

    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + &quot;.fxml&quot;));
        return fxmlLoader.load();
    }

    public static void main(String[] args) {
        launch();
    }

}&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;PrimaryController&lt;/em&gt;:&lt;/p&gt;

&lt;pre class=&quot;brush:java;&quot;&gt;
package org.example;

import java.io.IOException;
import javafx.fxml.FXML;

public class PrimaryController {

    @FXML
    private void switchToSecondary() throws IOException {
        App.setRoot(&quot;secondary&quot;);
    }
}
&lt;/pre&gt;

&lt;pre class=&quot;brush:xml;&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;

&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;

&amp;lt;VBox alignment=&quot;CENTER&quot; spacing=&quot;20.0&quot; xmlns=&quot;http://javafx.com/javafx/11.0.2&quot; xmlns:fx=&quot;http://javafx.com/fxml/1&quot; fx:controller=&quot;org.example.PrimaryController&quot;&amp;gt;
   &amp;lt;children&amp;gt;
      &amp;lt;Label text=&quot;Primary View&quot; /&amp;gt;
      &amp;lt;Button fx:id=&quot;primaryButton&quot; text=&quot;Switch to Secondary View&quot; onAction=&quot;#switchToSecondary&quot;/&amp;gt;
   &amp;lt;/children&amp;gt;
   &amp;lt;padding&amp;gt;
      &amp;lt;Insets bottom=&quot;20.0&quot; left=&quot;20.0&quot; right=&quot;20.0&quot; top=&quot;20.0&quot; /&amp;gt;
   &amp;lt;/padding&amp;gt;
&amp;lt;/VBox&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;SecondaryController&lt;/em&gt;&amp;nbsp;wygląda analogicznie, więc myślę, że nie ma sensu go tutaj kopiować.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Rozwiązania, które zaserwował mi wujek Google niezbyt pomogły, jednak jakimś cudem aplikacja pogodowa (tzn. to, co do tej pory zrobiłem) jakoś się uruchamia&amp;nbsp;&lt;img alt=&quot;surprise&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/omg_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;surprise&quot;&gt;. Jak to możliwe? Dodam, że w stanie początkowym (tj. gdy kod miał postać taką, jak umieściłem powyżej) program również działał.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Ktoś wie co tu się mogło stać i co z tym fantem zrobić? Może ktoś ma pomysł na alternatywną konfigurację Mavena pod kątem JavyFX?&lt;/p&gt;

&lt;p&gt;Za każdą pomoc będę bardzo wdzięczny&amp;nbsp;&lt;img alt=&quot;smiley&quot; src=&quot;https://forum.przyszlyprogramista.pl/qa-plugin/ckeditor4/plugins/smiley/images/regular_smile.png&quot; style=&quot;height:23px; width:23px&quot; title=&quot;smiley&quot;&gt;&lt;/p&gt;</description>
<category>Java</category>
<guid isPermaLink="true">http://forum.przyszlyprogramista.pl/?qa=222/failed-to-execute-goal-org-openjfx-javafx-maven-plugin-0-run</guid>
<pubDate>Thu, 13 May 2021 17:06:42 +0000</pubDate>
</item>
</channel>
</rss>