因爲JFreeChart組件的版本、操做平臺、JDK 的設置等因素,在使用 JFreeChart 組件時可能會出現中文亂碼的現象。遇到此問題時,可經過設置文字的字體來解決問題。在此提供如下兩種解決此問題的方法。 java
1、設置主題的樣式(強烈推薦) dom
在建立統計圖表以前,建立主題樣式並指定樣式中的字體,經過 ChartFactory 類的 setChartTheme() 方法設置主題樣式,這種方式在目前已知的全部版本的 JFreeChart 中都可使用,效果至關不錯,我找了很久才找到,並且我以爲這應該是解決中文字體顯示爲方塊的比較標準的方法之壹。 測試
//建立主題樣式 StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); //設置標題字體 standardChartTheme.setExtraLargeFont(new Font("隸書", Font.BOLD, 20)); //設置圖例的字體 standardChartTheme.setRegularFont(new Font("宋書", Font.PLAIN, 15)); //設置軸向的字體 standardChartTheme.setLargeFont(new Font("宋書", Font.PLAIN, 15)); //應用主題樣式 ChartFactory.setChartTheme(standardChartTheme); //生成統計圖 JFreeChart chart=ChartFactory.createBarChart3D("水果產量圖", "水果", "水果", dataset, PlotOrientation.VERTICAL, true, true, true);
2、指定亂碼文字的字體(僅對舊版本有效) 字體
使用JFreeChart繪製圖表的時候,若是使用默認的字體,一般會致使圖標中的漢字顯示爲亂碼。解決方法以下:JFreeChart 是用戶使用該庫提供的各種圖標的統一接口,而它主要由三個部分構成:Title(標題),Legend(圖例),Plot(圖表主體)。所以對亂碼文字的處理轉化爲分別對這三個部分的字體進行處理,設置方法分別以下: spa
一、設置 Title 的字體,直接獲取 Title 的內容並設置其字體爲中文字體的某種格式便可。 code
TextTitle textTitle = freeChart.getTitle(); textTitle.setFont(new Font("宋體", Font.BOLD, 20));二、設置 Legend 的字體,直接獲取其引用並設置字體樣式。
LegendTitle legend = freeChart.getLegend(); if (legend != null) { legend.setItemFont(new Font("宋體", Font.BOLD, 20)); }
三、設置 Plot 的字體,先獲取 Plot 的 X 軸和 Y 軸對象的引用,而後分別設置其字體樣式。對於不一樣類型的圖表對應 Plot 的不一樣的實現類,設置字體的方法也不徹底相同。如下以柱狀圖的設置爲例進行說明: 對象
CategoryPlot plot = (CategoryPlot)freeChart.getPlot(); //獲取柱狀圖的 X 軸 CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,20));//設置x軸座標上的字體 domainAxis.setLabelFont(new Font("宋體",Font.BOLD,20));//設置x軸上的標題的字體 //獲取柱狀圖的 Y 軸 ValueAxis valueAxis = plot.getRangeAxis(); valueAxis.setTickLabelFont(new Font("宋體",Font.BOLD,20));//設置y軸座標上的字體 valueAxis.setLabelFont(new Font("宋體",Font.BOLD,20));//設置y軸座標上的標題的字體
另外特別要提出來的是,網上有不少關於設置 Plot 的 X 軸與 Y 軸字體的文章,用的就是上面的方法,可是很遺憾,我在嘗試的過程當中發現這個方法並不奏效,若是強行使用下面的方法,要麼就是沒法在 API 中找到對應的方法名稱,要麼就是在獲取 Plot 引用的時候提示 ClassCastException(更具體的緣由是 XYPlot 類型沒法轉化爲 CategoryPlot 類型),由於我使用的是當前 JFreeChart 的最新版本1.0.15,因此我初步分析是 JFreeChart 的開發人員在最新版的開發包中將這幾個方法的聲明去掉了,在舊版本的 JFreeChart 中以上方法也許是可行的,不過我沒有測試過,若是有誰用過 JFreeChart 比較早期的版本,能夠在本文下方留言,共同討論提升。 接口
對於使用PiePlot的圖標,如餅狀圖,一般按照以下方式進行設置: 開發
PiePlot plot = (PiePlot)freeChart.getPlot(); plot.setLabelFont(new Font("宋體", Font.BOLD, 15));