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:
Y, por ejemplo, usando la API de Places:
Y puedes conseguir esto:
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 extends String> 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 AutoCompleteTextFieldextiende TextField propiedad de objeto final privadalastSelectedItem = new SimpleObjectProperty <> (); / ** * Las entradas de autocompletar existentes. * / final privado SortedSetentradas; / ** * 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 ObservableListFilterEntries = 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 (SortedSetentrySet) super (); this.entries = (entrySet == null? new TreeSet <> (): entrySet); this.filteredEntries.addAll (entradas); entryPopup = new ContextMenu (); textProperty (). addListener ((ObservableValue extends String> observableValue, String s, String s2) -> if (getText () == null ); focusProperty (). addListener ((ObservableValue extends Boolean> observableValue, booleano aBooleano, booleano aBooleano2) -> entradasPopup.hide (); ); / ** * Obtiene el conjunto existente de entradas de autocompletar. * * @return Las entradas de autocompletar existentes. * / public SortedSetgetEntries () 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 (ListasearchResult, String text) ListamenuItems = 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 ObservableListgetFilteredEntries () 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