Now, it is time for you to learn to produce more sophisticated drawings.
For example, you can obtain an instance of the Dimension
class using
the getSize
method with a component as the
target. The width
and height
instance variables of
the Dimension
instance provide the current width and height of the
component.
With the width and height in hand, you can draw not just a
horizontal line with a simple vertical line at the proper place
to represent the value of the value
instance variable. Instead, you
can draw a combination
that
fills out the window; places the vertical
line at the position indicated by the values of the minValue
,
maxValue
, and value
variables; scales the vertical line in
proportion to the horizontal line; and stays centered, even as you move, or
change the size of, the window:
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();} // Getter to be defined public void paint(Graphics g) { // Obtain Dimension instance: Dimension d = getSize(); // Draw: int meterWidth = d.width * 3 / 4; int meterHeight = meterWidth / 20; int dialPosition = meterWidth * (value - minValue) / (maxValue - minValue); int xOffset = (d.width - meterWidth) / 2; int yOffset = d.height / 2; g.drawLine(xOffset, yOffset, xOffset + meterWidth, yOffset); g.drawLine(xOffset + dialPosition, yOffset, xOffset + dialPosition, yOffset - meterHeight); } public Dimension getMinimumSize() {return new Dimension(150, 150);} public Dimension getPreferredSize() {return new Dimension(150, 150);} }