Stanęłam ostatnio wobec następującego problemu: potrzebowałam aplikacji do ręcznej klasyfikacji stron internetowych. Chodziło o to, żeby wyświetlić użytkownikowi kolejną stronę z listy i udostępnić przycisk, który pozwoli odpowiednio ją oznaczyć.
Oczywiście Java nie jest najlepszym rozwiązaniem, jakie można tu zaproponować, ale chciałam zrobić to szybko w języku zrozumiałym dla większości zainteresowanych osób. Na Stack Overflow znalazłam kilka wątków pokazujących, jak uruchomić domyślną przeglądarkę internetową w danym systemie, ale po pierwsze przechwycenie danych z niej to wyższa szkoła jazdy, a po drugie chciałam otwierać kolejne strony w tej samej zakładce.
Z pomocą przyszła JavaFX, a dokładniej komponent WebView oparty na otwartym silniku WebKit. W tej wersji uruchomienie przeglądarki i obserwowanie zachowania użytkownika staje się dziecinnie proste. Poniżej całość kodu, który:
- wyświetla stronę startową
- wypisuje w konsoli kolejne strony odwiedzane przez użytkownika
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import javafx.application.Application; import javafx.concurrent.Worker; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.VBox; import javafx.scene.web.WebView; import javafx.stage.Stage; /** http://namiekko.pl/2016/08/20/przegladarka-w-javie-fx/ */ public class BrowserApp extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { stage.setTitle("I spy..."); VBox root = new VBox(); root.setPadding(new Insets(5, 5, 5, 5)); Label label = new Label("http://www.namiekko.pl"); root.getChildren().add(label); WebView webview = new WebView(); webview.getEngine().load(label.getText()); webview.setPrefSize(1600, 700); webview.getEngine().getLoadWorker().stateProperty().addListener( (observable, oldValue, newValue) -> { if (newValue == Worker.State.SUCCEEDED) { label.setText(webview.getEngine().getLocation()); System.out.println(label.getText()); } } ); root.getChildren().add(webview); stage.setScene(new Scene(root)); stage.show(); } } |
Najważniejsze linie:
- 13: aplikacja JavaFX
- 22: tytuł okienka
- 24: pionowy układ elementów
- 27: etykieta wyświetlająca aktualny url
- 30-31: przeglądarka i strona startowa
- 34-41: obsługa zdarzenia: załadowanie nowej strony (z lambdą!)
Fajne, prawda?
