Java GUI应用程序-在地图上覆盖图像(背景图像)
我想创建一个简单的GUI应用程序来显示城市地图 然后,我希望通过编程将酒店、餐厅等项目(资产)作为图像添加到此地图 伪代码将如下所示Java GUI应用程序-在地图上覆盖图像(背景图像),java,image,user-interface,map,overlay,Java,Image,User Interface,Map,Overlay,我想创建一个简单的GUI应用程序来显示城市地图 然后,我希望通过编程将酒店、餐厅等项目(资产)作为图像添加到此地图 伪代码将如下所示 [set up background object with map image covering entire form] [create hotel1 object (image, label with icon or whatever] hotel1.image = "hotel.png"; hotel1.size-x = 30; hotel1.size-
[set up background object with map image covering entire form]
[create hotel1 object (image, label with icon or whatever]
hotel1.image = "hotel.png";
hotel1.size-x = 30;
hotel1.size-y = 30;
hotel1.location-x = 450; (pixels)
hotel1.location-y = 300;
background-object.add(hotel1);
[create restaurant1 object (image, label with icon or whatever]
restaurant1 .image = "hotel.png";
restaurant1 .size-x = 30;
restaurant1 .size-y = 30;
restaurant1 .location-x = 600; (pixels)
restaurant1 .location-y = 400;
background-object.add(restaurant1);
[repeat for hotel2, hotel3, restaurant2 etc...]
这样我就可以在地图上添加任意数量的资产。我需要的其他功能是
- 更改资产的图像(例如,显示资产的不同图像)
hotel1.image=“hotel\u closed.png”代码>
- 重叠资产(如果它们靠近)
- 为每个资源注册单击事件处理程序
- 更改资产的可见性
hotel1.visible=false代码>
非常感谢,伊恩,我假设你希望你的应用程序是桌面的,而不是基于网络的。在这种情况下,在使用第三方映射解决方案之前,我已经做了类似的事情(尽管相当复杂)。不幸的是,该解决方案需要许可证,并且无论如何都不再可用 如果您只想在桌面应用程序中使用一个简单的不可滚动地图,我建议您从Swing解决方案开始。查看扩展JComponent对象并重写该方法
public void paintComponent(Graphics g){
// use g to draw things
}
使用图形对象绘制地图图像和图标。将此组件添加到Swing JFrame中,并设置正确的大小和布局
如果你想在网页上看到这一点,那么其他人会更好地帮助你
编辑:
从这里和另一篇文章中给出的反馈来看,我认为您可能会从一段代码中获益,因此:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SwingPaintDemo extends JPanel {
private BufferedImage map = null;
private BufferedImage pointer = null;
public SwingPaintDemo() {
this.setPreferredSize(new Dimension(200, 200));
loadImagesFromFile();
}
private void loadImagesFromFile() {
// load your images form file - these are fakes:
map = new BufferedImage(200, 200, BufferedImage.TYPE_3BYTE_BGR);
pointer = new BufferedImage(10, 10, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = map.getGraphics();
g.setColor(Color.GREEN);
g.fillRect(0, 0, 200, 200);
g = pointer.getGraphics();
g.setColor(Color.BLUE);
g.fillOval(0, 0, 10, 10);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// paint map
g.drawImage(map, 0, 0, this);
// paint pointers
g.drawImage(pointer, 50, 75, this);
}
// this main is for testing the class but can be used as a reference
public static void main(String... args) {
JFrame jf = new JFrame();
SwingPaintDemo mapper = new SwingPaintDemo();
jf.getContentPane().setLayout(new BorderLayout());
jf.getContentPane().add(mapper, BorderLayout.CENTER);
jf.setVisible(true);
jf.pack();
}
}
您将需要编辑此文件以从您的文件加载图像-我想使此文件自包含且易于运行,因此我刚刚内联创建了图像 你可以从很多地方开始,而不知道全部要求(即如果你需要下载地图、平铺地图等),我只能给你一些概述性建议 我会先通读一遍(没有特别的顺序)
当你对所有这些都感到满意时,你可能会想看看,它有一个很好的例子,就是拉谷歌和OpenStreet地图。答案还没有被接受。因此,以您的伪代码为例,我使用JavaFX2编写了一个快速覆盖示例。使用您提到的JPG文件,可以很容易地将WebView替换为ImageView 代码如下:
package simple.map.overlay;
import java.io.InputStream;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class SimpleMapOverlay extends Application
{
@Override
public void start(Stage primaryStage)
{
WebView mapView = new WebView();
WebEngine webEngine = mapView.getEngine();
String url = "http://maps.google.com/maps?q=Baramerica,+South+Alamo+Street,+San+Antonio,+TX&hl=en&ll=29.416647,-98.488655&spn=0.025196,0.035233&sll=29.416423,-98.489814&sspn=0.006299,0.008808&hq=Baramerica,&hnear=S+Alamo+St,+San+Antonio,+Texas&t=m&z=15";
url += "&output=embed";
webEngine.load(url);
VBox vBox = new VBox(5);
vBox.getChildren().add(mapView);
InputStream instream = SimpleMapOverlay.class.getResourceAsStream("beer.png");
Image beerImage = new Image(instream);
instream = SimpleMapOverlay.class.getResourceAsStream("food.jpg");
Image foodImage = new Image(instream);
Marker laTunaMarker = new Marker(beerImage, "La Tuna");
laTunaMarker.setLayoutX(210);
laTunaMarker.setLayoutY(480);
Marker rosariosMarker = new Marker(foodImage, "Rosarios");
rosariosMarker.setLayoutX(360);
rosariosMarker.setLayoutY(300);
Group root = new Group();
root.getChildren().add(vBox);
root.getChildren().add(laTunaMarker);
root.getChildren().add(rosariosMarker);
Scene scene = new Scene(root);
primaryStage.setTitle("Hello Map World with Markers!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
class Marker extends Group
{
public Marker(Image image, String text)
{
ImageView imageView = new ImageView(image);
Label label = new Label(text);
VBox vbox = new VBox(5);
vbox.getChildren().add(imageView);
vbox.getChildren().add(label);
getChildren().add(vbox);
}
}
}
谢谢你的回复,肯。是的,这是一个桌面应用程序。也可以在下面的帖子中看到我的评论。干杯,伊安坦克斯。我把需求保持得很好,很简单。它将是一个JPG作为地图背景,在本地配置资源,并设置与表单相同的大小(800px^2)。摆在我面前的主要问题似乎是重叠图像,并将它们放置在给定坐标集的表格上。我已经阅读了您在上面链接的页面……看起来实现这一点的最佳方法是在JFrame中有一个JLayeredPane,然后为背景图像添加一个JPanel,然后为地图上的每个资产添加一个较小的JPanel(在JPanel实例上绘制一个BuffereImage),使用xPos和yPos定位在JLayeredPane上。你觉得这个解决方案怎么样?另外,如果你是第二次更新,地图将是一个专门的,所以不能从G.maps或类似的来源。背景.PNG就可以了!由于我传递给#getResourceAsStream()的路径,图像需要与SimpleMapOverlay类位于同一目录中。感谢大家的回答。我使用了每个答案中的一些信息(对不起,onebeartoe,我最终避免了使用JavaFX),但答案是关于这个主题的丰富信息。(我的解决方案是我对MadProgrammer帖子的评论)