package Chart; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Rectangle2D; import javax.swing.JPanel; /** Panel ce deseneaza histograma */ public class ChartPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; /** Constructor ChartPanel. @param v masivul de valori a histogramei @param n masivul de nume a valorilor din histograma @param t titlul */ public ChartPanel(double[] v, String[] n, String t) { names = n; values = v; title = t; } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // gasirea valorilor mminim maxim if (values == null) return; double minValue = 0; double maxValue = 0; for (int i = 0; i < values.length; i++) { if (minValue > values[i]) minValue = values[i]; if (maxValue < values[i]) maxValue = values[i]; } if (maxValue == minValue) return; int panelWidth = getWidth(); int panelHeight = getHeight(); Font titleFont = new Font("SansSerif", Font.BOLD, 20); Font labelFont = new Font("SansSerif", Font.PLAIN, 10); // gasirea latimii titlului FontRenderContext context = g2.getFontRenderContext(); Rectangle2D titleBounds = titleFont.getStringBounds(title, context); double titleWidth = titleBounds.getWidth(); double top = titleBounds.getHeight(); // desenarea titlului double y = -titleBounds.getY(); double x = (panelWidth - titleWidth) / 2; g2.setFont(titleFont); g2.drawString(title, (float)x, (float)y); // latimea labelurilor LineMetrics labelMetrics = labelFont.getLineMetrics("", context); double bottom = labelMetrics.getHeight(); y = panelHeight - labelMetrics.getDescent(); g2.setFont(labelFont); // mastabul si latimea benzilor double scale = (panelHeight - top - bottom) / (maxValue - minValue); int barWidth = panelWidth / values.length; // desenarea benzilir for (int i = 0; i < values.length; i++) { // coordonatele dreprughiului double x1 = i * barWidth + 1; double y1 = top; double height = values[i] * scale; if (values[i] >= 0) y1 += (maxValue - values[i]) * scale; else { y1 += maxValue * scale; height = -height; } // implerea si desenarea conturului Rectangle2D rect = new Rectangle2D.Double(x1, y1, barWidth - 2, height); g2.setPaint(Color.RED); g2.fill(rect); g2.setPaint(Color.BLACK); g2.draw(rect); // draw the centered label below the bar Rectangle2D labelBounds = labelFont.getStringBounds(names[i], context); double labelWidth = labelBounds.getWidth(); x = i * barWidth + (barWidth - labelWidth) / 2; g2.drawString(names[i], (float)x, (float)y); } } private double[] values; private String[] names; private String title; }