Advertisement
Guest User

RoundSlider

a guest
Oct 29th, 2010
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.14 KB | None | 0 0
  1. package RoundSlider;
  2.  
  3. import java.awt.BasicStroke;
  4. import java.awt.Color;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.event.MouseEvent;
  8. import java.awt.event.MouseListener;
  9. import java.awt.event.MouseMotionListener;
  10. import java.awt.geom.Arc2D;
  11. import java.awt.geom.Line2D;
  12. import java.awt.geom.Point2D;
  13. import java.awt.image.BufferedImage;
  14. import java.text.DecimalFormat;
  15.  
  16. import javax.swing.JComponent;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19.  
  20. import Graphics.Arcs;
  21.  
  22. /**
  23.  * @author Praveen Kumar
  24.  *
  25.  */
  26.  
  27. public class RoundSlider extends JComponent implements MouseMotionListener,
  28.         MouseListener {
  29.  
  30.     private static final long serialVersionUID = 1L;
  31.  
  32.     private BufferedImage bufferedimage = null;
  33.  
  34.     private int centerX, centerY, width, marginX = 40, marginY = 40,
  35.             displayWidth;
  36.     private double startAz = 0.0d, endAz = 90.0d, startAzPixelXY[],
  37.             endAzPixelXY[];
  38.     private int tickMarkXY[][];
  39.     private final int AZ_INTERVAL = 10, END_AZ = 360;
  40.     private Line2D.Double startLine = new Line2D.Double();
  41.     private Line2D.Double endLine = new Line2D.Double();
  42.     private AzimuthSlider parentPanel = null;
  43.     private Point2D.Double mousePointXY = new Point2D.Double();
  44.     private Arc2D.Double arcShade = new Arc2D.Double();
  45.     private boolean strtAzFlag = false, endAzFlag = false;
  46.     /* Colors */
  47.  
  48.     private Color startAzLineColor = Color.MAGENTA;
  49.     private Color endAzLineColor = Color.WHITE;
  50.     private Color BgColor = Color.BLACK;
  51.     private Color AzStrColor = Color.RED;
  52.     private Color OuterCircleColor = Color.BLUE;
  53.     private Color InnerCircleColor = Color.CYAN;
  54.     private Color AzMarkingLineColor = Color.GREEN;
  55.  
  56.     private boolean startFlag = false;
  57.  
  58.     private DecimalFormat azFormat = new DecimalFormat("###.0");
  59.  
  60.     public RoundSlider(int width) {
  61.         this.width = width;
  62.         displayWidth = width - (2 * marginX);
  63.         centerX = centerY = width / 2;
  64.         setSize(width, width);
  65.         tickMarkXY = getTickMarkCoordinates(AZ_INTERVAL);
  66.         startAzPixelXY = getPixelValue((displayWidth + 10) / 2, startAz, 1);
  67.  
  68.         startLine.setLine(centerX, centerY, centerX + startAzPixelXY[0],
  69.                 centerY + startAzPixelXY[1]);
  70.         endAzPixelXY = getPixelValue((displayWidth + 10) / 2, endAz, 1);
  71.         endLine.setLine(centerX, centerY, centerX + endAzPixelXY[0], centerY
  72.                 + endAzPixelXY[1]);
  73.  
  74.         addMouseListener(this);
  75.         addMouseMotionListener(this);
  76.  
  77.     }
  78.  
  79.     @Override
  80.     protected void paintComponent(Graphics g) {
  81.         if (!startFlag)
  82.             return;
  83.         Graphics2D gb = (Graphics2D) g;
  84.         bufferedimage = (BufferedImage) createImage(width, width);
  85.         Graphics2D graphics = bufferedimage.createGraphics();
  86.  
  87.         // Background
  88.         graphics.setColor(BgColor);
  89.         graphics.fillOval(marginX, marginY, displayWidth, displayWidth);
  90.  
  91.         // outer circle
  92.         graphics.setStroke(new BasicStroke(5F));
  93.         graphics.setColor(OuterCircleColor);
  94.         graphics.drawOval(marginX, marginY, displayWidth, displayWidth);
  95.  
  96.         // tick mark
  97.         drawTickMark(graphics);
  98.         graphics.setColor(AzStrColor);
  99.         graphics.drawString("0", centerX - 2, marginY - 5);
  100.         graphics.drawString("90", displayWidth + marginX + 5, centerY);
  101.         graphics.drawString("270", marginX - 30, centerY);
  102.         graphics.drawString("180", centerX, displayWidth + marginY + 20);
  103.  
  104.         // Az line
  105.         graphics.setColor(startAzLineColor);
  106.         graphics.setStroke(new BasicStroke(3F));
  107.         /* startAzPixelXY = getPixelValue((displayWidth+10)/2, startAz, 1); */
  108.         graphics.draw(startLine);
  109.         /*
  110.          * graphics.drawLine(centerX, centerY,
  111.          * (int)(Math.round(startAzPixelXY[0])) + centerX, (int) (
  112.          * Math.round(startAzPixelXY[1])) + centerY);
  113.          */
  114.         graphics.setColor(endAzLineColor);
  115.         graphics.draw(endLine);
  116.  
  117.         /*
  118.          * endAzPixelXY =getPixelValue((displayWidth+10)/2, endAz, 1);
  119.          *
  120.          * graphics.drawLine(centerX, centerY,
  121.          * (int)(Math.round(endAzPixelXY[0])) + centerX, (int) (
  122.          * Math.round(endAzPixelXY[1])) + centerY);
  123.          */
  124.  
  125.         graphics.setColor(new Color(255, 255, 255, 127));
  126.         int conStrtAz = 0, diffAz = 0;
  127.  
  128.         conStrtAz = (int) (90 - startAz);
  129.         /*
  130.          * if(conStrtAz<0) conStrtAz=360+conStrtAz;
  131.          */
  132.  
  133.         diffAz = ((int) (startAz - endAz));
  134.  
  135.         graphics.fillArc(marginX, marginY, displayWidth, displayWidth,
  136.                 conStrtAz, diffAz);
  137.         // Inner Circle
  138.         graphics.setColor(InnerCircleColor);
  139.         graphics.fillOval(centerX - 5, centerY - 5, 10, 10);
  140.  
  141.         gb.drawImage(bufferedimage, 0, 0, this);
  142.     }
  143.  
  144.     private void drawTickMark(Graphics2D graphics) {
  145.         graphics.setColor(AzMarkingLineColor);
  146.         graphics.setStroke(new BasicStroke(2F));
  147.         for (int i = 0; i < tickMarkXY.length; i++) {
  148.             graphics.draw(new Line2D.Float(tickMarkXY[i][0] + centerX,
  149.                     tickMarkXY[i][1] + centerY, tickMarkXY[i][2] + centerX,
  150.                     tickMarkXY[i][3] + centerY));
  151.         }
  152.     }
  153.  
  154.     public static void main(String[] args) {
  155.  
  156.         RoundSlider slider = new RoundSlider(200);
  157.  
  158.         slider.startPainting();
  159.         JFrame frm = new JFrame("Azimuth Slider");
  160.         frm.add(slider);
  161.         frm.setSize(250, 250);
  162.         frm.setVisible(true);
  163.  
  164.         frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  165.     }
  166.  
  167.     @Override
  168.     public void mouseDragged(MouseEvent me) {
  169.         double az = getAzAndRangeOfMousePoint(me.getX(), me.getY(), centerX,
  170.                 centerY, 1)[0];
  171.         if (endAzFlag) {
  172.             endAz = az;
  173.             endAzPixelXY = getPixelValue((displayWidth + 10) / 2, endAz, 1);
  174.             endLine.x2 = centerX + endAzPixelXY[0];
  175.             endLine.y2 = centerY + endAzPixelXY[1];
  176.         }
  177.         if (strtAzFlag) {
  178.             startAz = az;
  179.             startAzPixelXY = getPixelValue((displayWidth + 10) / 2, startAz, 1);
  180.             startLine.x2 = centerX + startAzPixelXY[0];
  181.             startLine.y2 = centerY + startAzPixelXY[1];
  182.         }
  183.  
  184.         /*
  185.          * double az = getAzAndRangeOfMousePoint(me.getX(), me.getY(), centerX,
  186.          * centerY, 1)[0]; double
  187.          * diffstart=startLine.ptLineDistSq(me.getX(),me.getY()); double
  188.          * diffend=endLine.ptLineDistSq(me.getX(),me.getY());
  189.          * System.out.println(diffstart+" "+diffend);
  190.          *
  191.          * System.out.println(startLine.getBounds().contains(me.getX(),me.getY()));
  192.          * System.out.println(endLine.getBounds().contains(me.getX(),me.getY()));
  193.          * if(diffstart<diffend) { startAz=az; startAzPixelXY =
  194.          * getPixelValue((displayWidth+10)/2, startAz, 1);
  195.          * startLine.x2=centerX+startAzPixelXY[0];
  196.          * startLine.y2=centerY+startAzPixelXY[1]; } else { endAz=az;
  197.          * endAzPixelXY = getPixelValue((displayWidth+10)/2, endAz, 1);
  198.          * endLine.x2=centerX+endAzPixelXY[0];
  199.          * endLine.y2=centerY+endAzPixelXY[1]; }
  200.          */
  201.  
  202.         /*
  203.          * if(startLine.contains(me.getX(),me.getY())) {
  204.          * System.out.println("Start True"); }else
  205.          * if(endLine.contains(me.getX(),me.getY())) { System.out.println("End
  206.          * True"); }
  207.          */
  208.  
  209.         /*
  210.          * double az = getAzAndRangeOfMousePoint(me.getX(), me.getY(), centerX,
  211.          * centerY, 1)[0];
  212.          *
  213.          *
  214.          *
  215.          *
  216.          * double
  217.          * startDiff=startAz-az,endDiff=endAz-az,startDiffAbs=Math.abs(startDiff),endDiffAbs=Math.abs(endDiff);
  218.          *
  219.          * System.out.println(startDiff+" "+endDiff);
  220.          *
  221.          *
  222.          *
  223.          * if (startDiffAbs < endDiffAbs) { if (startDiffAbs < 45) if (az > 0 &&
  224.          * az < endAz) startAz = az;
  225.          *  } else if (endDiffAbs < 45) {
  226.          *
  227.          * if (az > startAz && az < 360) endAz = az; }
  228.          *
  229.          *
  230.          *
  231.          * System.out.println(startAz+" "+endAz+"\n");
  232.          */
  233.  
  234.         if (parentPanel != null)
  235.             parentPanel.strtAz.setText(azFormat.format(startAz));
  236.         repaint();
  237.         // startFlag=endAzFlag=false;
  238.     }
  239.  
  240.     @Override
  241.     public void mouseMoved(MouseEvent arg0) {
  242.     }
  243.  
  244.     public int[][] getTickMarkCoordinates(int AzInterval) {
  245.         int[][] xy = new int[360 / AzInterval][4];
  246.         int cnt = 0;
  247.         for (int az = 0; az < END_AZ; az += AzInterval) {
  248.             double startXY[] = getPixelValue((displayWidth - 15) / 2, az, 1);
  249.             double endXY[] = getPixelValue((displayWidth - 5) / 2, az, 1);
  250.  
  251.             xy[cnt][0] = (int) startXY[0];
  252.             xy[cnt][1] = (int) startXY[1];
  253.             xy[cnt][2] = (int) endXY[0];
  254.             xy[cnt][3] = (int) endXY[1];
  255.             cnt++;
  256.  
  257.         }
  258.         return xy;
  259.     }
  260.  
  261.     public static double[] getAzAndRangeOfMousePoint(int x, int y, int centerX,
  262.             int centerY, double kmPerPixel) {
  263.         double AzAndRange[] = new double[2];
  264.         int xDash = x - centerX;
  265.         int yDash = centerY - y;
  266.         double az = Math.toDegrees(Math.atan2(xDash, yDash));
  267.         if (az < 0)
  268.             az += 360;
  269.         double rng = Math.sqrt((xDash * xDash) + (yDash * yDash)) * kmPerPixel;
  270.  
  271.         AzAndRange[0] = az; // deg
  272.         AzAndRange[1] = rng; // Km
  273.         return AzAndRange;
  274.     }
  275.  
  276.     public static double[] getPixelValue(double range, double az, double kmPixel) {
  277.         double pixelPoint[] = new double[2];
  278.         double rng = range / kmPixel;
  279.         double azmth = Math.toRadians(-90 + az);
  280.  
  281.         pixelPoint[0] = (rng * Math.cos(azmth));
  282.         pixelPoint[1] = (rng * Math.sin(azmth));
  283.         return pixelPoint;
  284.     }
  285.  
  286.     public void setBgColor(Color bgColor) {
  287.         BgColor = bgColor;
  288.     }
  289.  
  290.     public void setOutterCircleColor(Color clr) {
  291.         OuterCircleColor = clr;
  292.     }
  293.  
  294.     public void setInnerCircleColor(Color clr) {
  295.         InnerCircleColor = clr;
  296.     }
  297.  
  298.     public void setAzLinecolor(Color clr) {
  299.         startAzLineColor = clr;
  300.     }
  301.  
  302.     public void setMarkingColor(Color clr) {
  303.         AzMarkingLineColor = clr;
  304.     }
  305.  
  306.     public void setAzimuth(double az) {
  307.         startAz = az;
  308.         repaint();
  309.     }
  310.  
  311.     public void startPainting() {
  312.         startFlag = true;
  313.         repaint();
  314.     }
  315.  
  316.     public double getAzimuth() {
  317.         return startAz;
  318.     }
  319.  
  320.     public void setParent(AzimuthSlider slider) {
  321.         parentPanel = slider;
  322.     }
  323.  
  324.     @Override
  325.     public void mouseClicked(MouseEvent e) {
  326.         // TODO Auto-generated method stub
  327.  
  328.     }
  329.  
  330.     @Override
  331.     public void mouseEntered(MouseEvent e) {
  332.         // TODO Auto-generated method stub
  333.  
  334.     }
  335.  
  336.     @Override
  337.     public void mouseExited(MouseEvent e) {
  338.         // TODO Auto-generated method stub
  339.  
  340.     }
  341.  
  342.     @Override
  343.     public void mousePressed(MouseEvent e) {
  344.         // TODO Auto-generated method stub
  345.         System.out.println("Mouse pressed");
  346.  
  347.         if (startLine.intersectsLine(e.getX() - 10, e.getY() - 10,
  348.                 e.getX() + 10, e.getY() + 10)) {
  349.             strtAzFlag = true;
  350.             System.out.println("Start True");
  351.         }
  352.         if (endLine.intersectsLine(e.getX() - 10, e.getY() - 10, e.getX() + 10,
  353.                 e.getY() + 10)) {
  354.             endAzFlag = true;
  355.  
  356.             System.out.println("end True");
  357.         }
  358.  
  359.     }
  360.  
  361.     @Override
  362.     public void mouseReleased(MouseEvent e) {
  363.         // TODO Auto-generated method stub
  364.         System.out.println("Mouse Released");
  365.         strtAzFlag = endAzFlag = false;
  366.     }
  367.  
  368. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement