📄 chart.java
字号:
/**
@version 1.30 2000-05-12
@author Cay Horstmann
*/
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class Chart extends JApplet
{
public void init()
{
String v = getParameter("values");
if (v == null) return;
int n = Integer.parseInt(v);
double[] values = new double[n];
String[] names = new String[n];
int i;
for (i = 0; i < n; i++)
{
values[i] = Double.parseDouble
(getParameter("value_" + (i + 1)));
names[i] = getParameter("name_" + (i + 1));
}
Container contentPane = getContentPane();
contentPane.add(new ChartPanel(values, names,
getParameter("title")));
}
}
/**
A panel that draws a bar chart.
*/
class ChartPanel extends JPanel
{
/**
Constructs a ChartPanel.
@param v the array of values for the chart
@param n the array of names for the values
@param t the title of the chart
*/
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;
// compute the minimum and maximum values
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);
// compute the extent of the title
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D titleBounds
= titleFont.getStringBounds(title, context);
double titleWidth = titleBounds.getWidth();
double top = titleBounds.getHeight();
// draw the title
double y = -titleBounds.getY(); // ascent
double x = (panelWidth - titleWidth) / 2;
g2.setFont(titleFont);
g2.drawString(title, (float)x, (float)y);
// compute the extent of the bar labels
LineMetrics labelMetrics
= labelFont.getLineMetrics("", context);
double bottom = labelMetrics.getHeight();
y = panelHeight - labelMetrics.getDescent();
g2.setFont(labelFont);
// get the scale factor and width for the bars
double scale = (panelHeight - top - bottom)
/ (maxValue - minValue);
int barWidth = panelWidth / values.length;
// draw the bars
for (int i = 0; i < values.length; i++)
{
// get the coordinates of the bar rectangle
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;
}
// fill the bar and draw the bar outline
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -