21493

Draw objects on a loaded image in java

Question:

I need help with loading an image of a map and drawing a point on the received location. Here is the code of the server:

import java.awt.Dimension; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Server extends JFrame{ private static int PACKETSIZE = 100 ; private static int WIDTH = 1340; private static int HEIGHT = 613; public DatagramSocket socket; public DrawPoint drawPoint; public Server() { setDefaultCloseOperation(EXIT_ON_CLOSE); drawPoint = new DrawPoint(); drawPoint.setPreferredSize(new Dimension(WIDTH, HEIGHT)); add(drawPoint); pack(); setVisible(true); } //This method converts the lat,lon coordinates to the coordinates of the pixels in the image of the map (which is 1319 by 664) public String GPStoCoord( double lat, double lon){ double latref = 30.631103; double lonref = -96.358981; double yref = 0.015128; double xref = 0.035589; int coordx = (int)((latref - lat)/yref*1319); int coordy = (int)((lon - lonref)/xref*664); return coordx + "," +coordy; } private void GPSlocdraw() { try { DatagramPacket packet_GPS1 = new DatagramPacket(new byte[PACKETSIZE], PACKETSIZE); socket.receive(packet_GPS1); String sGPS1 = new String(packet_GPS1.getData()); String latlonGPS1[] = sGPS1.split(",", 2); double lat1 = Double.parseDouble(latlonGPS1[0]); double lon1 = Double.parseDouble(latlonGPS1[1]); //converting the GPS data to coordinates String coord = GPStoCoord(lat1,lon1); String latlon[] = coord.split(","); int lat = Integer.parseInt(latlon[0]); int lon = Integer.parseInt(latlon[1]); drawPoint.setCoordx(lat); drawPoint.setCoordy(lon); drawPoint.repaint(); } catch( IOException e){} } public static void main( String args[] ) { SwingUtilities.invokeLater(() -> new Server().GPSlocdraw()); } }

Here is the code to the DRawPoint class, where I am trying to draw the image loaded and draw the oval graphic on top of it by it seems that whichever is drawn last erases the other.

import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class DrawPoint extends JPanel { private int coordx, coordy; @Override public void paintComponent( Graphics g){ try { BufferedImage map = ImageIO.read(new File("CSmap.png")); super.paintComponent(g); g.setColor(Color.BLACK); g.fillOval(coordx,coordy,8,8); g.drawImage(map,0,0,this); } catch(IOException e){} } //use setters to change the state void setCoordy( int coordy) {this.coordy = coordy;} void setCoordx( int coordx) {this.coordx = coordx;} }

Also, how can I draw something to permanently stay on the image for the entire run?

Answer1:

The following code demonstrates repeatedly drawing a point in different location on an underlying image.<br /> It can be copy pasted into one file (Server.java) and executed:

import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.io.IOException; import java.net.URL; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class Server extends JFrame{ private DrawPoint drawPoint; public Server() { setDefaultCloseOperation(EXIT_ON_CLOSE); drawPoint = new DrawPoint(); add(drawPoint); pack(); setVisible(true); } //This conversion is not essential for the question asked. remove to make it Mcve //public String GPStoCoord( double lat, double lon){} private void GPSlocdraw() { //generate random x,y within an arbitrary range Random rnd = new Random(); int maxY = 350, maxX = 250; Timer timer = new Timer(1000, e -> { //periodically change coordinates and repaint drawPoint.setCoordx(rnd.nextInt(maxX)); drawPoint.setCoordy(rnd.nextInt(maxY)); drawPoint.repaint(); }); timer.start(); } public static void main( String args[] ) { SwingUtilities.invokeLater(() -> new Server().GPSlocdraw()); } } class DrawPoint extends JPanel { private int coordx, coordy, width, height; private Image map; public DrawPoint() { try { //to make an mcVe always use publicly available resources map = ImageIO.read(new URL("http://www.digitalphotoartistry.com/rose1.jpg")); height = map.getHeight(this); width = map.getWidth(this); setPreferredSize(new Dimension(width, height)); //fit panel to image } catch ( IOException ex) {ex.printStackTrace(); } } @Override public void paintComponent(Graphics g){ //read from file once, not every method run BufferedImage map = ImageIO.read(new File("CSmap.png")); super.paintComponent(g); g.setColor(Color.YELLOW); g.drawImage(map,0,0,this);//image first g.fillOval(coordx,coordy,8,8); //point on top } //use setters to change the state void setCoordy( int coordy) {this.coordy = coordy;} void setCoordx( int coordx) {this.coordx = coordx;} }

As for "how can I draw something to permanently stay on the image for the entire run?" : to get an idea do not change ovals x and y coordinates, and see what happens.

Recommend

  • To get primary and foreign keys right in ERD
  • Add Annotation to 3D Scatterplot in Plotly
  • Correct implementation of List Iterator methods
  • Runtime.exec() gives Error: Could not find or load main class
  • Click on button in another program - FindWindow, C#
  • C++ friend class std::vector
  • How to get listview position?
  • Regarding starting the threads on a condition
  • How to access profile picture with Facebook API in Swift 3?
  • How to use jQuery's $.post() method with async/await and typescript
  • Question about instantiating object
  • Subclassing QGraphicsItem prevents me from being able to use itemAt() on a QGraphicsScene/View
  • Angularjs pass function from Controller to Directive (or call controller function from directive) -
  • Checking if an array in C is symmetric
  • c# open webrowser in many tab
  • Bypass multiple inheritance in Java
  • how to find common suffix in java by using method
  • Display java JPanel in a JFrame
  • onBackPressed() not being executed
  • iOS: Detect app start via notification press
  • how to adjust image in a panel in Java swing?
  • How to access EntityManager inside Entity class in EJB3
  • how to do an event when i swipe from fragment to the other
  • JFileChooser in front of fullscreen Swing application
  • HTML download movie download link
  • How to draw moving and Running sine wave chart using JFree chart in java?
  • Possible to stop flickering java tooltip in heavyweight mode?
  • sending/ receiving email in Java
  • Eraser for UIBezierPath
  • Suggestions to manage Login/Logout transitions
  • Exception on Android 4.0 `android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode)`
  • unknown Exception android
  • EntityFramework adding new object to nested object collection
  • Checking variable from a different class in C#
  • Django query for large number of relationships
  • Why is Django giving me: 'first_name' is an invalid keyword argument for this function?
  • How can I use `wmic` in a Windows PE script?
  • failed to connect to specific WiFi in android programmatically
  • How to push additional view controllers onto NavigationController but keep the TabBar?
  • How can I use threading to 'tick' a timer to be accessed by other threads?