import javax.swing.*; import java.awt.*; public class Histogram extends JPanel { // Count the occurrence of 26 letters private int[] count; /** Set the count and display histogram */ public void showHistogram(int[] count) { this.count = count; repaint(); } /** Paint the histogram */ protected void paintComponent(Graphics g) { if (count == null) return; // No display if count is null super.paintComponent(g); // Find the panel size and bar width and interval dynamically int width = getWidth(); int height = getHeight(); int interval = (width - 40) / count.length; int individualWidth = (int)(((width - 40) / 24) * 0.60); // Find the maximum count. The maximum count has the highest bar int maxCount = 0; for (int i = 0; i < count.length; i++) { if (maxCount < count[i]) maxCount = count[i]; } // x is the start position for the first bar in the histogram int x = 30; // Draw a horizontal base line g.drawLine(10, height - 45, width - 10, height - 45); for (int i = 0; i < count.length; i++) { // Find the bar height int barHeight = (int)(((double)count[i] / (double)maxCount) * (height - 55)); // Display a bar (i.e. rectangle) g.drawRect(x, height - 45 - barHeight, individualWidth, barHeight); // Display a letter under the base line g.drawString((char)(65 + i) + "", x, height - 30); // Move x for displaying the next character x += interval; } } /** Override getPreferredSize */ public Dimension getPreferredSize() { return new Dimension(300, 300); } }