Frage: Google Maps "Map" in Java

spearmint

Mitglied
Hallo,

ich hätte da eine Frage bezüglich eines Java Programmes das Bilder (als Tiles "Kacheln"), wie zum Beispiel bei Google Maps, darstellen kann.

Es soll lediglich 10x10 einzelne Bilder als gesammtes Bild auf einer Fläche willkürlich verschiebbar machen.
Ist es möglich diese Bilder auch zu "löschen/auszublenden" wenn das Bild die sichtbare Fläche verlässt.

Ich habe keine Idee wie ich ein solches Programm realisieren könnte. Vielleicht hat jemand eine Idee oder kann mir eine Vorgehenweise schildern.

Zeichne ich die Bilder auf ein JPanel oder nehme ich besser ein JScrollPane? Gibt es vielleicht komplett andere Lösungsansätze? Benutze ich Image und Graphics oder Graphics2D?

Versucht habe ich es schon mit einem JPanel, aber damit komme ich nicht zum Ziel.
Hier mal der Code mit dem ich es Versucht habe. Wäre klasse, wenn jemand ne Idee hat wie sowas zu Lösen ist.

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class Oink extends JPanel {
	
	private Image image;
	private BufferedImage bi;
	private MotionHandler mh;
	private int x,y;
	
	public Oink () {	
		mh = new MotionHandler();
		//image = new ImageIcon("x.png").getImage();
		image = getToolkit().getImage("x.png");
		addMouseMotionListener(mh);

		MediaTracker mt = new MediaTracker(this);
		mt.addImage(image, 1);
		try {
			mt.waitForAll();
		} catch (Exception e) {
			System.out.println("Image not found.");
		}

		bi = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB);
		Graphics2D big = bi.createGraphics();
		big.drawImage(image, 0, 0, this);
	}
	
	public class MotionHandler extends MouseAdapter {
		
		private int x,y;
		
		public void mouseDragged (MouseEvent e) {	
			int dx,dy;
			dx = e.getX() - x;
			dy = e.getY() - y;
			x += dx;
			y += dy;		
			
			System.err.println("mouseDragged: dx=" + x + " / dy=" + y);
		}
		
		/*
		public void mouseClicked (MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			System.out.println("mouseClicked: x=" + x);
			System.out.println("mouseClicked: y=" + y);		
		}
		
		public void mousePressed (MouseEvent e) {
			x = e.getX();
			y = e.getY();
			
			System.out.println("mousePressed: x=" + x);
			System.out.println("mousePressed: y=" + y);
		}
		*/
		public int getPosX () {
			return x;
		}
		
		public int getPosY () {
			return y;
		}

	}
	
	public void paintComponent (Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		
		x = mh.getPosX();
		y = mh.getPosY();
		
		g2.drawImage(bi,x,y,this);
		repaint();
		/*
	    for (int i=x+512;i<1512;i+=256) {
	    	for (int j=y;j<800;j+=256) {
	    		g2.drawImage(bi, i,j, this);
	    		g2.drawString("" + i, i,j);
	    		repaint();
	    	}
	    }
	    
	    for (int i=x+256;i>=-256;i-=256) {
	    	for (int j=y+512;j>=-256;j-=256) {
	    		g2.drawImage(bi, i,j, this);
	    		g2.drawString("" + j, i,j);
	    		repaint();
	    	}	    	
	    }
	    */
	}
	
}

Danke im Voraus. 🙂
 
Sry irgendwas stimmt da noch nicht ganz mit der Abtastung, aber ich hab jetzt keine Zeit mehr. Aber die Idee vom Groben ist denke ich trotzdem klar. Wenn du die Panels rauslöschen willst wenn man sie zu weit wegzieht musst du sie halt per getContentPane().remove(panel) aus dem OuterPanel rausnehmen.

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class OuterPanel extends JPanel
{
    private static final int DIM = 10;
    private static final int SIZE = 50;

    public OuterPanel()
    {
	setLayout(null);
	for (int x = 0; x < DIM; x++)
	{
	    for (int y = 0; y < DIM; y++)
	    {
		JPanel p = new InnerPanel();
		p.setBounds(x * SIZE, y * SIZE, SIZE, SIZE);
		add(p);
	    }
	}
    }

    private class InnerPanel extends JPanel implements MouseListener, MouseMotionListener
    {

	private Color color; // replace with image
	private Point hookPoint;
	private Point prevLocation;

	private InnerPanel()
	{
	    Random r = new Random();
	    color = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
	    addMouseListener(this);
	    addMouseMotionListener(this);
	}

	@Override
	protected void paintComponent(Graphics g)
	{
	    super.paintComponent(g);
	    g.setColor(color);
	    g.fillRect(0, 0, getWidth(), getHeight()); // replace with g.drawImage
	}

	@Override
	public void mousePressed(MouseEvent e)
	{
	    hookPoint = e.getPoint();
	    prevLocation = getLocation();
	}

	@Override
	public void mouseDragged(MouseEvent e)
	{
	    updateLocation(e.getPoint());
	}

	@Override
	public void mouseMoved(MouseEvent e)
	{
	}

	@Override
	public void mouseClicked(MouseEvent e)
	{
	}

	@Override
	public void mouseReleased(MouseEvent e)
	{
	}

	@Override
	public void mouseEntered(MouseEvent e)
	{
	}

	@Override
	public void mouseExited(MouseEvent e)
	{
	}

	private void updateLocation(Point p)
	{
	    int deltaX = Math.abs(p.x - hookPoint.x);
	    int deltaY = Math.abs(p.y - hookPoint.y);
	    int newX = prevLocation.x + (p.x > hookPoint.x ? deltaX : -deltaX);
	    int newY = prevLocation.y + (p.y > hookPoint.y ? deltaY : -deltaY);
	    setLocation(newX, newY);
	}
    }

    public static void main(String[] args)
    {
	SwingUtilities.invokeLater(new Runnable()
	{
	    @Override
	    public void run()
	    {
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane().add(new OuterPanel());
		f.setSize(DIM * SIZE, DIM * SIZE);
		f.setVisible(true);
	    }
	});

    }
}
 
Leider kam ich mit dem Beispiel auch nicht weiter. Nachdem ich meinen Code verändert/angepasst habe und versuche die Bilder zu verschieben, springt das Bild nach dem "mouse drag" und dem erneuten "klicken" wieder zum Ursprungspunkt. Also die Koordinaten des "klicks" werden zu den Ursprungskoordinaten des Bildes.

Ich muss es dann wohl weiter probieren, trotzdem vielen Dank für die Hilfe und das Beispiel. 🙂
 

Zurück
Oben