十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
如果读取得到的二维数组 ,存储的是每个像素的颜色值 , 那么很简单, 可以使用 数组转换到图片(网上有很多的代码) , 然后绘制到JFrame等窗体上.
目前成都创新互联公司已为1000+的企业提供了网站建设、域名、网页空间、成都网站托管、企业网站设计、芒康网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
如果读取的二维数组,是类似于下面这种形式
{{2018,20},{2017,30},{2016,15}}
可以使用第三方的 JFreeChart 等 进行图表绘制, 优点 可以输出图片,可以显示到网页或者JFrame/Frame窗口上. 缺点: 效果不是很好看.实现动态效果比较麻烦
可以使用JavaFX 自带的图表组件进行绘制. 优点: 默认的效果不错, 动态效果实现起来也很简单 缺点: 一般只用于本地客户端上的显示
使用 BufferedImage和Graphics 类来绘制 一个图片, 优点: 自定义程度高, 可以充分发挥想象,绘制一个拉风的效果. 缺点: 有点麻烦.代码有点长了.[一般只用于验证码等小图片的绘制]
JFreeChart 效果图
JavaFX 效果图( 里面的数据是随即生成的,只是为了测试效果)
JavaFX饼状图的参考代码 ,我写了很多的注释
import javafx.animation.*;
import javafx.application.Application;
import javafx.collections.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.chart.PieChart.Data;
import javafx.scene.control.*;
import javafx.scene.effect.DropShadow;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
//
public class A03_PieChart03 extends Application {
public static void main(String[] args) {
launch(args);//启动程序
}
@Override
public void start(Stage primaryStage) throws Exception {
StackPane root = new StackPane();// 栈布局面板
Scene scene = new Scene(root, 500, 400);//场景
PieChart pc = new PieChart();//饼状图
ObservableListData datas = getDate();
pc.setData(datas);//设置饼状图的初始数据
pc.setTitle("流行技术市场占有率");// 设置饼图标题
pc.setLegendSide(Side.LEFT);// 图例 靠左
pc.setClockwise(false);// 逆时针显示
//pc.setLabelsVisible(false);// 隐藏饼状图上面的文字描述
DropShadow ds=new DropShadow(); // 阴影效果
ds.setOffsetX(3);//x轴偏移3
ds.setColor(Color.GREY);//阴影颜色
pc.setEffect(ds);//给饼状图设置阴影效果
root.getChildren().add(pc);//把饼状图添加到面板上
primaryStage.setTitle("动态饼状图");//设置标题
primaryStage.setScene(scene);//设置主场景
primaryStage.show();//显示窗口
// -------如果需要动态效果 , 那么就需要下面的代码---------
Timeline tl = new Timeline(); //时间轴动画
tl.getKeyFrames().add(new KeyFrame(Duration.millis(800), new EventHandlerActionEvent() {
@Override
public void handle(ActionEvent event) {
for (Data data : pc.getData()) {
data.setPieValue(Math.random()*50);//数据随即改变.(只是为了测试效果)
}
}}));
tl.setCycleCount(Animation.INDEFINITE);//循环次数无限
tl.play(); // 开始动画
}
// 初始的数据
private ObservableListData getDate() {
ObservableListData data = FXCollections.observableArrayList(new PieChart.Data("Java", 36.8),
new PieChart.Data("C++", 16.2), new PieChart.Data("Python", 12.3), new PieChart.Data("Ruby", 9.5),
new PieChart.Data("JavaScript", 21.5));
return data;
}
}
通过ChartFactory.createPieChart(null,data,true,true,false);
封装data采用jdbc方式从数据库读取数据封装到data;
java有第三方的jar包可以支持,jfreechar,可以到网上搜索相关资料,饼状图,柱状图。。都有。
用的时候挺简单的。
JFreeChart chart =null;
PiePlot pieplot = (PiePlot) chart.getPlot();//获取图片对象
// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}({2})", NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
以上为关键代码。需要通过setLableGenerator方法设置标签显示格式。StandardPieSectionLabelGenerator对象构造方法中,{0},{2}都将被替换为相应字符,{0}显示的是花生、大豆等信息,{2}显示的是百分比,后面两个参数是设置百分比格式,可以不设置,默认不保留小数点。最后图表显示的信息为:花生(xx.xx%) 小麦(xx.xx%)。
图下面的描述也可以设置显示格式,关键代码为:
// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
piePlot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
"{0} ({2})"));
注意,这是setLegendLableGenerator()。可以多试试new StandardPieSectionLabelGenerator("{0} ({2})")里的参数设置。