Histoqram 0 Answer(s) 3 years and 4 months ago
Posted in : Java Beginners
I want to do show histogram, when the user clicks the button, a new window appears that displays a histogram to show the occurrence of the letters in the text area. This is my coding,
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]; }
g.drawLine(10, height - 45, 10, 10);
// 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); } }
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MultipleWindowsDemo extends JFrame { private JTextArea jta; private JButton jbtShowHistogram = new JButton("Show Histogram"); private Histogram histogram = new Histogram(); // Create a new frame to hold the histogram panel private JFrame histogramFrame = new JFrame();
public MultipleWindowsDemo() { // Store text area in a scroll pane JScrollPane scrollPane = new JScrollPane(jta = new JTextArea()); scrollPane.setPreferredSize(new Dimension(300, 200)); jta.setWrapStyleWord(true); jta.setLineWrap(true); // Place scroll pane and button in the frame add(scrollPane, BorderLayout.CENTER); add(jbtShowHistogram, BorderLayout.SOUTH); // Register listener jbtShowHistogram.addActionListener(new ActionListener() { /** Handle the button action */ public void actionPerformed(ActionEvent e) { // Count the letters in the text area int[] count = countLetters(); // Set the letter count to histogram for display histogram.showHistogram(count); histogramFrame.setVisible(true); // Show the frame } });
// Create a new frame to hold the histogram panel histogramFrame.add(histogram); histogramFrame.pack(); histogramFrame.setTitle("Histogram"); }
/** Count the letters in the text area */ private int[] countLetters() { // Count for 26 letters int[] count = new int[26]; // Get contents from the text area String text = jta.getText(); // Count occurrence of each letter (case insensitive) for (int i = 0; i < text.length(); i++) { char character = text.charAt(i); if ((character >= 'A') && (character <= 'Z')) { count[(int)character - 65]++; // The ASCII for 'A' is 65 } else if ((character >= 'a') && (character <= 'z')) { count[(int)character - 97]++; // The ASCII for 'a' is 97 } } return count; // Return the count array }
public static void main(String[] args) { MultipleWindowsDemo frame = new MultipleWindowsDemo(); frame.setLocationRelativeTo(null); // Center the frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("MultipleWindowsDemo"); frame.pack(); frame.setVisible(true); } }
In the histogram class, i create 'g.drawLine(10, height - 45, 10, 10);'. When I run it, it shows y-axis..but how to make y-axis has number?I mean for example when user type 'MMM' at text area, then the bar for M is 3.