Home Segments Top Top Previous Next

734: Mainline

You can implement getValueAtCoordinates by reversing the centering and scaling calculations. The method casts the relative x coordinate to a float before division to prevent rounding down to zero, and then uses the round class method in the Math class to round the result returned to the nearest long, which is cast to the required int result:

import java.awt.*;
import javax.swing.*;
public class Meter extends JComponent implements MeterInterface {
 String title = "Title to be Supplied";
 int minValue, maxValue, value;
 public Meter (int x, int y) {
  minValue = x;
  maxValue = y;
  value = (y + x) / 2;
 }
 public void setValue(int v) {value = v; repaint();}
 public void setTitle(String t) {title = t; repaint();}
 public int getValueAtCoordinates (int x, int y) {                     
  Dimension d = getSize();                                             
  int meterWidth = d.width * 3 / 4;                                    
  int xOffset = (d.width - meterWidth) / 2;                            
  float fraction = (float)(x - xOffset) / meterWidth;                  
  return (int)Math.round(fraction * (maxValue - minValue) + minValue); 
 }                                                                     
// Define paint as in Segment 733 
 public Dimension getMinimumSize() {return new Dimension(150, 150);}  
 public Dimension getPreferredSize() {return new Dimension(150, 150);}      
}