카테고리 없음

[자바] 사용자 입력에서 동적 주파수 히스토그램을 만드는 방법

행복을전해요 2021. 2. 6. 01:20

입력에서 동적 크기를 만들기 위해 수행 할 작업은 다음과 같습니다.

  • 맵의 항목 수를 얻은 다음 각 막대의 너비를 원하는만큼 곱해야합니다.
  • 지도에서 가장 높은 값을 가져 와서 양을 늘리고 (그리기 위해) 그 값을 곱하여 높이를 만들어야합니다.
  • 이전 두 포인트의 높이와 너비를 기반으로 치수가있는 새 JPanel을 만듭니다.
  • 지도를 반복하여 막대를 그립니다.

나는에서 위의 일을 할 actionPerformed버튼과 나는 추가 JPanelA를 JOptionPane. 자세한 설명이 필요하면 알려주세요.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Histogram {

    private static final int BAR_WIDTH = 50;
        private static final int INCREMENT = 10;
        
            public Histogram() {
                    final JTextArea textArea = new JTextArea(5, 40);
                            textArea.setLineWrap(true);
                                    textArea.setWrapStyleWord(true);
                                            JButton go = new JButton("Histogram-me!");
                                                    JPanel panel = new JPanel(new BorderLayout());
                                                            panel.add(textArea, BorderLayout.CENTER);
                                                                    panel.add(go, BorderLayout.SOUTH);
                                                                    
                                                                            JFrame frame = new JFrame();
                                                                                    frame.add(panel);
                                                                                            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                                                                                    frame.pack();
                                                                                                            frame.setLocationRelativeTo(null);
                                                                                                                    frame.setVisible(true);
                                                                                                                    
                                                                                                                            go.addActionListener(new ActionListener() {
                                                                                                                                        public void actionPerformed(ActionEvent e) {
                                                                                                                                                        String text = textArea.getText();
                                                                                                                                                                        Map<Integer, Integer> counts = getCounts(text);
                                                                                                                                                                                        int width = counts.size() * BAR_WIDTH;
                                                                                                                                                                                                        int max = maxCount(counts);
                                                                                                                                                                                                                        int height = max * INCREMENT + 100;
                                                                                                                                                                                                                                        int horizon = height - 25;
                                                                                                                                                                                                                                                        HistogramPanel panel = new HistogramPanel(width, counts, height, horizon);
                                                                                                                                                                                                                                                                        //panel.setBorder(new LineBorder(Color.BLACK, 2));
                                                                                                                                                                                                                                                                                        JOptionPane.showMessageDialog(null, panel);
                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                            });
                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                    private int maxCount(Map<Integer, Integer> counts) {
                                                                                                                                                                                                                                                                                                                            int max = 0;
                                                                                                                                                                                                                                                                                                                                    for (Integer num : counts.values()) {
                                                                                                                                                                                                                                                                                                                                                if (num > max) {
                                                                                                                                                                                                                                                                                                                                                                max = num;
                                                                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                            return max;
                                                                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                                                                                                                                                    public class HistogramPanel extends JPanel {
                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                            int width;
                                                                                                                                                                                                                                                                                                                                                                                                                    int dimHeight;
                                                                                                                                                                                                                                                                                                                                                                                                                            int horizon;
                                                                                                                                                                                                                                                                                                                                                                                                                                    Map<Integer, Integer> counts;
                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                            public HistogramPanel(int width, Map<Integer, Integer> counts, int dimHeight, int horizon) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                        this.width = width;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                    this.counts = counts;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                this.dimHeight = dimHeight;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            this.horizon = horizon;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            @Override
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    protected void paintComponent(Graphics g) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                super.paintComponent(g);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            int x = 10;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        int height = entry.getValue() * INCREMENT;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        int y = horizon - height;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        g.fillRect(x, y, BAR_WIDTH - 10, height);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        g.drawString(entry.getKey() + " chars", x, horizon + 10);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        g.drawString(entry.getValue() + " times", x, y -2);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        x += BAR_WIDTH;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    @Override
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            public Dimension getPreferredSize() {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        return new Dimension(width, dimHeight);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        public static Map<Integer, Integer> getCounts(String input) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                Map<Integer, Integer> map = new HashMap<>();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        String[] array = input.split("[\\s.,;:!?(){}]+");
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                for (String s : array) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Integer size = s.length();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        if (!map.containsKey(size)) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        map.put(size, 1);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    } else {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    map.put(size, map.get(size) + 1);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                return map;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        public static void main(String[] args) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                SwingUtilities.invokeLater(new Runnable() {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            public void run() {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            Histogram histogram = new Histogram();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                });
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    


출처
https://stackoverflow.com/questions/22050158