Saltar al contenido

¿Cómo puedo utilizar las API de Google Maps en una aplicación de escritorio JavaFX?

Solución:

Solo pido que alguien proporcione un ejemplo de un código que simplemente cargaría el mapa y fijaría algunas ubicaciones en él.

Una de las formas en que puede hacer esto es utilizando una combinación de HTML, Javascript y JavaFX. Cree una instancia de Google Maps en html y javascript y luego llame a la URL en su programa JavaFX usando la clase WebEngine. WebEngine carga páginas web, crea sus modelos de documentos, aplica estilos según sea necesario y ejecuta JavaScript en las páginas. Después de eso, usará WebView para mostrar el contenido del mapa de Google como:

final WebEngine webEngine = new WebEngine(getClass().getResource("googlemap.html").toString());
final WebView webView = new WebView(webEngine);

Aquí hay un enlace con códigos de muestra para comenzar.

Puede utilizar algunas de las API sin una vista web; solo use las bibliotecas cliente de Google …

Agregue estas dependencias:

ingrese la descripción de la imagen aquí

Y, por ejemplo, usando la API de Places:

Y puedes conseguir esto:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Solo asegúrese de agregar su clave API de Google y habilitar la facturación … de lo contrario, no le permitirá hacer más de 1 encuesta al día.

private static final String API_KEY = add API KEY HERE;

Main.java

import com.google.maps.model.AddressComponentType;
import com.google.maps.model.PlaceDetails;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.apache.commons.lang3.StringUtils;
import test.AutoCompleteAddressField.AddressPrediction;

public class Main extends Application


    @Override
    public void start(Stage primaryStage)
    

        AutoCompleteAddressField text = new AutoCompleteAddressField();

        TextField streetField = new TextField();
        streetField.setPromptText("Street");

        TextField postalField = new TextField();
        postalField.setPromptText("PostalCode");

        TextField cityField = new TextField();
        cityField.setPromptText("City");

        TextField provinceField = new TextField();
        provinceField.setPromptText("Province");

        TextField countryField = new TextField();
        countryField.setPromptText("Country");

        Button clearButton = new Button("Clear");

        clearButton.setOnAction(e ->
        
            text.clear();
            text.getEntries().clear();
            streetField.clear();
            postalField.clear();
            cityField.clear();
            provinceField.clear();
            countryField.clear();

        );

        text.getEntryMenu().setOnAction((ActionEvent e) ->
        
            ((MenuItem) e.getTarget()).addEventHandler(Event.ANY, (Event event) ->
            
                if (text.getLastSelectedObject() != null)
                
                    text.setText(text.getLastSelectedObject().toString());
                    PlaceDetails place = AutoCompleteAddressField.getPlace((AddressPrediction) text.getLastSelectedObject());
                    if (place != null)
                    
                        streetField.setText(
                                StringUtils.join(
                                        AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.STREET_NUMBER),
                                        " ",
                                        AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.ROUTE))
                        );

                        postalField.setText(AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.POSTAL_CODE));
                        cityField.setText(AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.LOCALITY));
                        provinceField.setText(AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_1));
                        countryField.setText(AutoCompleteAddressField.getComponentLongName(place.addressComponents, AddressComponentType.COUNTRY));
                     else
                    
                        streetField.clear();
                        postalField.clear();
                        cityField.clear();
                        provinceField.clear();
                        countryField.clear();
                    
                
            );
        );

        VBox root = new VBox();
        root.getChildren().addAll(text, new Label(), streetField, postalField, provinceField, countryField, clearButton);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Test Google Places API");
        primaryStage.setScene(scene);
        primaryStage.show();
    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    
        launch(args);
    


AutoCompleteAddressField.java

import com.google.maps.GeoApiContext;
import com.google.maps.PlaceDetailsRequest;
import com.google.maps.PlacesApi;
import com.google.maps.QueryAutocompleteRequest;
import com.google.maps.errors.ApiException;
import com.google.maps.model.AddressComponent;
import com.google.maps.model.AddressComponentType;
import com.google.maps.model.AutocompletePrediction;
import com.google.maps.model.PlaceDetails;
import java.io.IOException;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.beans.value.ObservableValue;

public class AutoCompleteAddressField extends AutoCompleteTextField


    private static final String API_KEY = add API KEY HERE;

    public AutoCompleteAddressField()
    
        super(new TreeSet<>((AddressPrediction o1, AddressPrediction o2) -> o1.toString().compareTo(o2.toString())));

        textProperty().addListener((ObservableValue o, String oldValue, String newValue) ->
        
            if (newValue != null && !newValue.isEmpty())
            
                new Thread(() ->
                
                    AutocompletePrediction[] predictions = getPredictions(getText());

                    Platform.runLater(() ->
                    
                        getEntries().clear();
                        for (AutocompletePrediction prediction : predictions)
                        
                            getEntries().add(new AddressPrediction(prediction));
                        
                    );
                ).start();

            
        );
    

    public class AddressPrediction
    

        private final AutocompletePrediction prediction;

        public AddressPrediction(AutocompletePrediction prediction)
        
            this.prediction = prediction;
        

        @Override
        public String toString()
        
            return prediction.description;
        

        protected AutocompletePrediction getPrediction()
        
            return this.prediction;
        

    

    public static PlaceDetails getPlace(AddressPrediction prediction)
    
        if (prediction != null && prediction.getPrediction() != null && !prediction.getPrediction().placeId.isEmpty())
        
            PlaceDetailsRequest query = PlacesApi.placeDetails(new GeoApiContext.Builder().apiKey(API_KEY).build(), prediction.getPrediction().placeId);
            return query.awaitIgnoreError();
        
        return null;
    

    public static AutocompletePrediction[] getPredictions(String userInput)
    

        QueryAutocompleteRequest query = PlacesApi.queryAutocomplete(new GeoApiContext.Builder()
                .apiKey(API_KEY)
                .build(), userInput);
        try
        
            return query.await();
         catch (ApiException 

    public static String getComponentLongName(AddressComponent[] components, AddressComponentType type)
    

        for (AddressComponent component : components)
        
            for (AddressComponentType types : component.types)
            
                if (types.equals(type))
                
                    return component.longName;
                
            

        
        return "";
    

AutoCompleteTextField.java

import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.geometry.Side;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.CustomMenuItem;
import javafx.scene.control.TextField;

import java.util.LinkedList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;

/**
 * This class is a TextField which implements an "autocomplete" functionality,
 * based on a supplied list of entries.

* * If the entered text matches a part of any of the supplied entries these are * going to be displayed in a popup. Further the matching part of the entry is * going to be displayed in a special style, defined by * @link #textOccurenceStyle textOccurenceStyle. The maximum number of * displayed entries in the popup is defined by * @link #maxEntries maxEntries.
* By default the pattern matching is not case-sensitive. This behaviour is * defined by the @link #caseSensitive caseSensitive * .

* * The AutoCompleteTextField also has a List of * @link #filteredEntries filteredEntries that is equal to the search results * if search results are not empty, or @link #filteredEntries filteredEntries * is equal to @link #entries entries otherwise. If * @link #popupHidden popupHidden is set to true no popup is going to be * shown. This list can be used to bind all entries to another node (a ListView * for example) in the following way: *

 * 
 * AutoCompleteTextField auto = new AutoCompleteTextField(entries);
 * auto.setPopupHidden(true);
 * SimpleListProperty filteredEntries = new SimpleListProperty(auto.getFilteredEntries());
 * listView.itemsProperty().bind(filteredEntries);
 * 
 * 

* * @autor Caleb Brinkman * @autor Fabian Ochmann * @param
* / public class AutoCompleteTextField extiende TextField propiedad de objeto final privada lastSelectedItem = new SimpleObjectProperty <> (); / ** * Las entradas de autocompletar existentes. * / final privado SortedSet entradas; / ** * El conjunto de entradas filtradas:
* Igual a los resultados de la búsqueda si los resultados de la búsqueda no están vacíos, igual a * @link #entries entry en caso contrario. * / Private ObservableList FilterEntries = FXCollections.observableArrayList (); / ** * La ventana emergente utilizada para seleccionar una entrada. * / entradas del menú contextual privado Popup; / ** * Indica si la búsqueda distingue entre mayúsculas y minúsculas o no.
* Predeterminado: falso * / private boolean caseSensitive = false; / ** * Indica si la ventana emergente debe mostrarse o ocultarse. Use esto si * desea filtrar una lista / conjunto existente (por ejemplo, valores de * @link javafx.scene.control.ListView ListView). Haga esto vinculando * @link #getFilteredEntries () getFilteredEntries () a la lista / conjunto. * / private boolean popupHidden = false; / ** * El estilo CSS que se debe aplicar en las partes de la ventana emergente que coinciden * con el texto ingresado.
* Predeterminado: "-fx-font-weight: bold; -fx-fill: red;" *

* Nota: Este estilo se aplicará en una instancia * @link javafx.scene.text.Text Text. Ver el Guía de referencia de JavaFX CSS * para las propiedades CSS disponibles. * / private String textOccurenceStyle = "-fx-font-weight: bold;" + "-fx-fill: rgb (66,139,202);"; / ** * El número máximo de entradas que se muestran en la ventana emergente.
* Predeterminado: 10 * / private int maxEntries = 10; / ** * Construya un nuevo AutoCompleteTextField. * * @param entrySet * / public AutoCompleteTextField (SortedSet entrySet) super (); this.entries = (entrySet == null? new TreeSet <> (): entrySet); this.filteredEntries.addAll (entradas); entryPopup = new ContextMenu (); textProperty (). addListener ((ObservableValue observableValue, String s, String s2) -> if (getText () == null ); focusProperty (). addListener ((ObservableValue observableValue, booleano aBooleano, booleano aBooleano2) -> entradasPopup.hide (); ); / ** * Obtiene el conjunto existente de entradas de autocompletar. * * @return Las entradas de autocompletar existentes. * / public SortedSet getEntries () devolver entradas; / ** * Complete el conjunto de entradas con los resultados de búsqueda dados. La visualización está limitada * a 10 entradas, por motivos de rendimiento. * * @param searchResult El conjunto de cadenas coincidentes. * / private void populatePopup (Lista searchResult, String text) Lista menuItems = new LinkedList <> (); int count = Math.min (searchResult.size (), getMaxEntries ()); for (int i = 0; i
lastSelectedItem.set (itemObject); entradasPopup.hide (); ); menuItems.add (elemento); entradasPopup.getItems (). clear (); entradasPopup.getItems (). addAll (menuItems); public S getLastSelectedObject () return lastSelectedItem.get (); public ContextMenu getEntryMenu () return entryPopup; public boolean isCaseSensitive () return caseSensitive; public String getTextOccurenceStyle () return textOccurenceStyle; public void setCaseSensitive (boolean caseSensitive) this.caseSensitive = caseSensitive; public void setTextOccurenceStyle (String textOccurenceStyle) this.textOccurenceStyle = textOccurenceStyle; public boolean isPopupHidden () return popupHidden; public void setPopupHidden (boolean popupHidden) this.popupHidden = popupHidden; public ObservableList getFilteredEntries () devolver entradas filtradas; public int getMaxEntries () return maxEntries; public void setMaxEntries (int maxEntries) this.maxEntries = maxEntries;

Si te mola la idea, puedes dejar un post acerca de qué te ha impresionado de este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología