Java Swing是一个用于构建图形用户界面(GUI)的Java库,而Map API则是提供地图显示和地理信息服务的应用程序接口。将Map API集成到Swing应用中可以实现地图展示、位置标记、路径规划等功能。
基于OpenStreetMap的开源解决方案,专为Swing设计。
优势:
示例代码:
import org.jxmapviewer.JXMapViewer;
import org.jxmapviewer.viewer.DefaultTileFactory;
import org.jxmapviewer.viewer.GeoPosition;
import org.jxmapviewer.viewer.TileFactoryInfo;
public class SwingMapExample {
public static void main(String[] args) {
JXMapViewer mapViewer = new JXMapViewer();
// 创建OpenStreetMap的TileFactory
TileFactoryInfo info = new TileFactoryInfo(
"OpenStreetMap",
1, 15, 17,
256, true, true,
"https://tile.openstreetmap.org",
"x", "y", "z") {
@Override
public String getTileUrl(int x, int y, int zoom) {
return this.getBaseURL() + "/" + zoom + "/" + x + "/" + y + ".png";
}
};
DefaultTileFactory tileFactory = new DefaultTileFactory(info);
mapViewer.setTileFactory(tileFactory);
// 设置初始位置和缩放级别
GeoPosition frankfurt = new GeoPosition(50.11, 8.68);
mapViewer.setZoom(7);
mapViewer.setAddressLocation(frankfurt);
// 创建并显示窗口
JFrame frame = new JFrame("JXMapViewer Demo");
frame.getContentPane().add(mapViewer);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
使用JavaFX的WebView组件嵌入网页版地图API(如Google Maps、Mapbox等)。
优势:
示例代码:
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.*;
import java.awt.*;
public class WebViewMapExample {
public static void main(String[] args) {
JFrame frame = new JFrame("WebView Map Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel, BorderLayout.CENTER);
frame.setSize(800, 600);
Platform.runLater(() -> {
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
engine.load("https://www.openstreetmap.org/");
Scene scene = new Scene(webView);
fxPanel.setScene(scene);
});
frame.setVisible(true);
}
}
原因:
解决方案:
原因:
解决方案:
原因:
解决方案:
// 创建标记层
DefaultWaypointRenderer renderer = new DefaultWaypointRenderer() {
@Override
public void paintWaypoint(Graphics2D g, JXMapViewer map, Waypoint w) {
g.setColor(Color.RED);
g.fillOval(-5, -5, 10, 10);
g.setColor(Color.BLACK);
g.drawOval(-5, -5, 10, 10);
}
};
// 创建标记集合
Set<Waypoint> waypoints = new HashSet<>();
waypoints.add(new DefaultWaypoint(new GeoPosition(52.52, 13.41))); // 柏林
// 创建标记层
WaypointPainter<Waypoint> waypointPainter = new WaypointPainter<>();
waypointPainter.setWaypoints(waypoints);
waypointPainter.setRenderer(renderer);
// 添加到地图
mapViewer.setOverlayPainter(waypointPainter);
mapViewer.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && !e.isConsumed()) {
e.consume();
Point p = e.getPoint();
GeoPosition geo = mapViewer.convertPointToGeoPosition(p);
System.out.println("Clicked at: " + geo.getLatitude() + ", " + geo.getLongitude());
// 添加新标记
waypoints.add(new DefaultWaypoint(geo));
mapViewer.repaint();
}
}
});
Java Swing中集成Map API有多种方案,选择取决于项目需求。JXMapViewer是纯Java解决方案,适合需要完全控制且不希望依赖外部服务的场景;WebView集成方案则可以利用成熟的网页地图API,功能更丰富但依赖浏览器引擎。开发时需注意线程安全、性能优化和跨平台兼容性问题。
没有搜到相关的文章