Re: Drawing line on ImageIcon on panel after getting data
bH wrote:
I need(ed) help with the original design.... if it was worth your
notice here.
Others may comment on the worthiness of this example.
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.text.DecimalFormat;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
public class Ruler
extends JPanel
implements Runnable
{
private static final long serialVersionUID = 1L;
private BufferedImage mapImage;
private Point[] points = new Point[2];
private int clickCount = 0;
private static double factorPixelKilometer = 12.5;
private double factorKilometerStatueMile = 0.62137;
private double kilometers = 0.0;
private double miles = 0.0;
private Ruler()
{
try
{
mapImage = ImageIO.read(
new URL("http://www.lib.utexas.edu/maps/" +
"cia07/australia_sm_2007.gif"));
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
setPreferredSize(new Dimension(
mapImage.getWidth(),
mapImage.getHeight()));
MouseInputAdapter mouse = new Mouse();
addMouseListener(mouse);
addMouseMotionListener(mouse);
}
public static void main(String[] args)
{
Runnable r = new Runnable()
{
public void run()
{
Ruler ruler = new Ruler();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
frame.add(ruler);
frame.pack();
frame.setVisible(true);
new Thread(ruler).start();
}
};
EventQueue.invokeLater(r);
}
@Override
public void run()
{
while (true){}
}
@Override
public void paintComponent(Graphics g2D)
{
DecimalFormat f = new DecimalFormat();
f.setMaximumFractionDigits(2);
Graphics2D g = (Graphics2D)g2D;
g.drawImage(mapImage,0,0,null);
if(points[0] != null && points[1] != null)
{
g.drawLine(
points[0].x,
points[0].y,
points[1].x,
points[1].y);
g.drawString(
"Distance = " +
f.format(kilometers) +
" kilometers, " +
f.format(miles) +
" miles", 50, 50);
}
}
private class Mouse
extends MouseInputAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
if(clickCount == 0)
{
points[clickCount] =
new Point(e.getX(), e.getY());
clickCount = 1;
return;
}
if(clickCount == 1)
{
points[clickCount] =
new Point(e.getX(), e.getY());
clickCount = 0;
calculate();
repaint();
}
}
@Override
public void mouseMoved(MouseEvent e)
{
if(clickCount == 1)
{
points[1] =
new Point(e.getX(), e.getY());
calculate();
repaint();
}
}
private void calculate()
{
double deltaX = points[1].x - points[0].x;
double deltaY = points[1].y - points[0].y;
double pixelDistance = Math.pow(((deltaX * deltaX) +
(deltaY * deltaY)), 0.5);
kilometers = pixelDistance * factorPixelKilometer;
miles = kilometers * factorKilometerStatueMile;
}
}
}