开发一个程序显示一个直方图,它显示文本区域中每个字母出现的次数。每个字母用一种颜色标识。如下图所示:
初始界面:
输入字符:
显示结果:
代码实现:
一,HistogramBarChart类用于实现绘制直方图
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class HistogramBarChart extends JPanel{
private double[] dataValue={200,140,100,60,40};
private String[] dataName = {"CS", "Math", "Chem", "Biol", "Phys"};
private Color[] colors = {Color.red, Color.yellow, Color.green,
Color.blue, Color.cyan, Color.magenta, Color.orange, Color.pink,
Color.darkGray};
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(dataValue==null)return;
double max=dataValue[0];
for(int i=1;i<dataValue.length;++i)
max=Math.max(max, dataValue[i]);
int barWidth = (int)((getWidth() - 20.0)/dataValue.length - 10);
int maxBarHeight = getHeight() - 30;
g.drawLine(5, getHeight()-10, getWidth()-5, getHeight()-10);
int x=15;
for(int i=0;i<dataValue.length;++i)
{
g.setColor(colors[i%colors.length]);
int newHeight=(int)(maxBarHeight*dataValue[i]/max);
int y=getHeight()-10-newHeight;
g.fillRect(x, y, barWidth, newHeight);
g.setColor(Color.black);
if((dataName!=null)&&(i<dataName.length))
g.drawString(dataName[i], x, y-7);
x+=barWidth+10;
}
}
public void setData(String[] dataName,double[] dataValue)
{
this.dataName=dataName;
this.dataValue=dataValue;
repaint();
}
public HistogramBarChart() {
}
}
二,HistogramTask类,实现程序的动作监听部分
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class HistogramTask extends JPanel{
private JTextArea jta;
private JButton jbtShow=new JButton("Show Histogram");
private HistogramBarChart histogram=new HistogramBarChart();
private JFrame histogramPanel=new JFrame();
public HistogramTask() {
JScrollPane scrollPane=new JScrollPane(jta=new JTextArea());
scrollPane.setPreferredSize(new Dimension(300, 200));
jta.setWrapStyleWord(true);
jta.setLineWrap(true);
setLayout(new BorderLayout());
add(scrollPane,BorderLayout.CENTER);
add(jbtShow, BorderLayout.SOUTH);
jbtShow.addActionListener(new Listener());
}
class Listener implements ActionListener{
public void actionPerformed(ActionEvent e) {
int count[]=countLetters();
double[] data=new double[26];
for(int i=0;i<26;++i)
data[i]=count[i];
String[] letters=new String[26];
for(int i=0;i<26;++i)
letters[i]=""+(char)('A'+i);
histogram.setData(letters, data);
histogram.repaint();
histogramPanel.add(histogram);
histogramPanel.pack();
histogramPanel.setSize(400, 200);
histogramPanel.setLocationRelativeTo(null);
histogramPanel.setTitle("Bar Chart");
histogramPanel.setVisible(true);
histogramPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private int[] countLetters()
{
int[] count=new int[55];
String text=jta.getText().trim();
for(int i=0;i<text.length();++i)
{
char character=text.charAt(i);
if((character>='A')&&(character<='Z'))
count[(int)character-65]++;
else if((character>='a')&&(character<='z'))
count[(int)character-95]++;
}
return count;
}
}
}
三,Frame
import javax.swing.JFrame;
public class MainFrame extends JFrame
private HistogramTask panel=new HistogramTask();
public MainFrame() {
add(panel);
}
public static void main(String[] args) {
MainFrame frame=new MainFrame();
frame.setSize(400, 200);
frame.setTitle("直方图");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}