![]() |
![]() |
![]() |
![]() |
![]() |
|
Doing path-oriented drawing requires including the
java.awt.geom package, as shown in the following adaptation of
the Meter definition given in Segment 1113. Note
also that moveTo and lineTo require float arguments,
rather than int arguments. Also, the Graphics2D class
defines a drawString method that takes float arguments, so
the following definition uses float variables for drawing the text.
Thus, both line drawing and text drawing are done in user coordinates.
import java.awt.*; import javax.swing.*; import java.awt.geom.*; 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 void paint(Graphics x) { Graphics2D g = (Graphics2D) x; // Obtain Dimension instance: Dimension d = getSize(); // Draw: float meterWidth = d.width * 3 / 4; float meterHeight = meterWidth / 20; float pointerPosition = meterWidth * (value - minValue) / (maxValue - minValue); float lineXOffset = (d.width - meterWidth) / 2; float lineYOffset = d.height / 2; GeneralPath path = new GeneralPath(); path.moveTo(lineXOffset, lineYOffset); path.lineTo(lineXOffset + meterWidth, lineYOffset); path.moveTo(lineXOffset + pointerPosition, lineYOffset); path.lineTo(lineXOffset + pointerPosition, lineYOffset - meterHeight); g.draw(path); // Prepare font int fontSize = d.width / 30; g.setFont(new Font("Helvetica", Font.BOLD, fontSize)); // Write title: FontMetrics f = g.getFontMetrics(); float stringWidth = f.stringWidth(title); float textXOffset = (d.width - stringWidth) / 2; float textYOffset = (d.height / 2) + (2 * f.getHeight()); g.drawString(title, textXOffset, textYOffset); } public Dimension getMinimumSize() {return new Dimension(150, 100);} public Dimension getPreferredSize() {return new Dimension(150, 100);} }