package com.sky.java.chat;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.Arc2D;
import java.awt.geom.Area;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 绘制带阴影的饼图
*
* @author Biao
*/
@SuppressWarnings("serial")
public class Pie extends JPanel {
// 饼图中每一个部分的百分比
private double[] percents = { 10.72, 15.38, 3.74, 10.26, 6.56, 5.69, 10.72, 15.38, 6.15, 18.0 };
// 饼图的颜色
private Color[] pieColors;
public Pie() {
List<Color> colors = new ArrayList<Color>();
colors.add(getColorFromHex("#169800"));
colors.add(getColorFromHex("#00E500"));
colors.add(getColorFromHex("#D0F15A"));
colors.add(getColorFromHex("#FF7321"));
colors.add(getColorFromHex("#E2FF55"));
colors.add(getColorFromHex("#AA6A2D"));
colors.add(getColorFromHex("#BFDD89"));
colors.add(getColorFromHex("#D718A5"));
colors.add(getColorFromHex("#00DBFF"));
colors.add(getColorFromHex("#00FF00"));
pieColors = colors.toArray(new Color[0]);
}
public static Color getColorFromHex(String hex) {
try {
return new Color(Integer.valueOf(hex.substring(1), 16));
} catch (Exception e) {
return Color.BLACK;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int w = 380;
int h = (int) (w * 0.618);
fillPies(g2d, percents, 30, 30, w, h);
}
private void fillPies(Graphics2D g2d, double[] percents, int x, int y, int w, int h) {
int colorIndex = 0;
double startAngle = 0;
double arcAngle = 0;
// 一次性绘制完阴影,然后再绘制饼图的效果比绘制饼图的同时绘制它的阴影好
for (int i = 0; i < percents.length; ++i) {
arcAngle = percents[i] * 3.6;
if (i + 1 == percents.length) {
arcAngle = 360 - startAngle;
}
Arc2D.Double arcTop = new Arc2D.Double(x, y, w, h, startAngle, arcAngle, Arc2D.PIE);
g2d.setColor(pieColors[colorIndex].darker());
g2d.fill(buildShadow(arcTop));
colorIndex = (colorIndex + 1) % pieColors.length;
startAngle += arcAngle;
}
colorIndex = 0;
startAngle = 0;
for (int i = 0; i < percents.length; ++i) {
arcAngle = percents[i] * 3.6;
if (i + 1 == percents.length) {
arcAngle = 360 - startAngle;
}
Arc2D.Double arcTop = new Arc2D.Double(x, y, w, h, startAngle, arcAngle, Arc2D.PIE);
g2d.setColor(pieColors[colorIndex]);
g2d.fill(arcTop);
colorIndex = (colorIndex + 1) % pieColors.length;
startAngle += arcAngle;
}
}
private Area buildShadow(Arc2D arc) {
int shadowDapth = 10;
Arc2D arcBottom = new Arc2D.Double(arc.getX(), arc.getY() + shadowDapth, arc.getWidth(),
arc.getHeight() + 0, arc.getAngleStart(), arc.getAngleExtent(), Arc2D.CHORD);
Point2D topLeft = new Point2D.Double(arc.getStartPoint().getX(), arc.getStartPoint().getY());
Point2D topRight = new Point2D.Double(arc.getEndPoint().getX(), arc.getEndPoint().getY());
Point2D bottomLeft = new Point2D.Double(arcBottom.getStartPoint().getX(), arcBottom
.getStartPoint().getY());
Point2D bottomRight = new Point2D.Double(arcBottom.getEndPoint().getX(), arcBottom
.getEndPoint().getY());
double[] xpoints = { topLeft.getX(), topRight.getX(), bottomRight.getX(), bottomLeft.getX() };
double[] ypoints = { topLeft.getY(), topRight.getY(), bottomRight.getY(), bottomLeft.getY() };
GeneralPath path = new GeneralPath();
path.moveTo(xpoints[0], ypoints[0]);
path.lineTo(xpoints[1], ypoints[1]);
path.lineTo(xpoints[2], ypoints[2]);
path.lineTo(xpoints[3], ypoints[3]);
path.closePath();
Area area = new Area(arcBottom);
area.add(new Area(path));
return area;
}
private static void createGuiAndShow() {
JFrame frame = new JFrame("");
frame.getContentPane().add(new Pie());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int sw = Toolkit.getDefaultToolkit().getScreenSize().width;
int sh = Toolkit.getDefaultToolkit().getScreenSize().height;
int w = 500;
int h = 400;
int x = (sw - w) / 2;
int y = (sh - h) / 2 - 40;
x = x > 0 ? x : 0;
y = y > 0 ? y : 0;
frame.setBounds(x, y, w, h);
frame.setVisible(true);
}
public static void main(String[] args) {
createGuiAndShow();
}
}
分享到:
相关推荐
4. **库引用**:可能包含对图形库的导入,如Python的matplotlib库,JavaScript的Chart.js或d3库,或Java的Swing或JavaFX库。 学习和理解这些源代码可以帮助你掌握如何在不同编程环境中创建饼图。例如,你可能会学到...
5. **绘制图表**:最后,你可以将图表渲染到Swing组件,如JFrame,或者输出到文件。 ```java ChartPanel chartPanel = new ChartPanel(chart); JFrame frame = new JFrame("JFreeChart Pie Chart"); frame....
生成图表后,我们可以选择将其保存为图像文件,或者嵌入到Swing组件中,实现动态交互。 JFreeChart库也支持自定义绘图,例如添加背景图、网格线、图例、标题等元素。这些元素的样式都可以通过ChartCustomizer类进行...
要生成饼图,我们首先需要引入Java的图形库,通常可以选择Java AWT(Abstract Window Toolkit)或Swing库。然而,这些库的图形功能相对较弱,对于复杂的数据可视化,我们可以借助JFreeChart库,这是一个强大的、开源...
5. **Swing组件**:JFreeChart可以方便地集成到Java Swing应用中,例如使用`ChartPanel`组件直接将图表添加到GUI上。 6. **输出格式**:JFreeChart支持多种输出格式,包括PNG、JPEG、SVG和PDF,满足不同场景的需求...
10. Java Swing界面编程:文档中出现的JOptionPane类表明可能涉及使用Swing构建图形界面的知识点,这是Java中处理用户界面的一个重要组成部分。 11. 正则表达式:虽然没有明确提及,但“System.out.println((number...
- **多样的图表类型**:JFreeChart支持多种图表类型,如饼图(Pie Chart)、柱状图(Bar Chart)、线形图(Line Chart)、面积图(Area Chart)、散点图(Scatter Plot)以及甘特图(Gantt Chart)等,满足不同数据...
- 饼图(pie):用于显示各部分占总体的比例,视觉效果直观。 - 散点图(scatter):用于展示两个变量之间的关系,每个点代表一个数据样本。 - 地图(map):结合地理信息,展示不同区域的数据分布。 - 更多图表...
3. 饼图(Pie Charts):显示各部分占总体的比例。 4. 散点图(Scatter Plots):展示两个变量之间的关系。 5. 直方图(Histograms):表示数据分布的频数或频率。 6. 区域图(Area Charts):强调数据的范围或区域...
6. **饼图分割图(Pie Section Charts)**:饼图的一种变体,可以进一步细分每个扇区。 7. **甘特图(Gantt Charts)**:用于项目管理,展示任务的开始和结束时间。 8. **热力图(Heat Maps)**:二维矩阵,用颜色...
jFreeChart库提供了丰富的API,可以方便地生成多种类型的图表,包括柱状图(Bar Chart)、饼图(Pie Chart)、折线图(Line Chart)以及散点图(Scatter Plot)等。它支持多种输出格式,如SVG、PNG、JPEG和PDF,可以...
1. **饼图(Pie Chart)**:如`pie_chart_code.jsp`和`pie_chart.jsp`所示,饼图通过扇形区域表示数据的比例关系,常用于展示各部分占总体的百分比。 2. **条形图(Bar Chart)**:如`bar_chart_code.jsp`和`bar_...
- 饼图(Pie Chart):显示各部分占总体的比例。 - 线图(Line Chart):展示数据随时间的变化趋势。 - 散点图(Scatter Plot):用于显示两个变量之间的关系。 - 折线图(XY Plot):在X轴和Y轴上分别表示两个...
- **饼图(Pie Chart)**: 使用`ChartFactory.createPieChart()`创建,展示各部分所占整体的比例。 - **线形图(Line Chart)**: 使用`ChartFactory.createLineChart()`创建,适合表示数据随时间变化的趋势。 - **...
1. **图表类型**:JFreeChart支持多种图表类型,包括饼图(Pie Chart)、柱状图(Bar Chart)、线图(Line Chart)、散点图(Scatter Plot)、甘特图(Gantt Chart)以及时间序列图(Time Series Chart)等,满足...
4. 饼图(Pie Chart):饼图是表示整体与部分之间比例关系的理想选择。JFreeChart允许定制扇区颜色、标签、阴影效果,甚至可以创建动态旋转的饼图。 5. 共享一个X轴的两个曲线图(Overlaid Charts):这种图表可以...
- **Swing 组件(Swing Components)**:JFreeChart 可以轻松地与 Swing 应用程序集成,例如在 JApplet 或 JFrame 中嵌入图表。 - **Web 应用(Web Applications)**:通过 JavaServer Pages (JSP) 或 JavaServer ...
1. **多样的图表类型**:JFreeChart支持多种图表类型,包括但不限于柱状图(Bar Chart)、折线图(Line Chart)、饼状图(Pie Chart)、散点图(Scatter Plot)、甘特图(Gantt Chart)以及各种金融图表,如股票图和...
- **饼图(Pie Chart)**:直观展示各部分占总体的比例。 - **散点图(Scatter Plot)**:用于表示两个变量之间的关系。 - **3D图表**:增加视觉效果,但可能影响读取数据的清晰度。 3. **自定义图表**:...
- **饼图(Pie Chart)**:显示各部分占整体的比例,适用于展示数据的构成。 - **柱状图(Bar Chart)**:以柱子的高度表示数据值,可以是单列或多列,适用于比较不同类别的数值。 - **线图(Line Chart)**:通过...