```java
/*
* LWUIT + ChartComponent,实现多种图表
* 本例实现的是“饼图”
*/
package com.sun.lwuit.uidemo;
import com.sun.lwuit.Button;
import com.sun.lwuit.Command;
import com.sun.lwuit.Font;
import com.sun.lwuit.Form;
import com.sun.lwuit.Image;
import com.sun.lwuit.Label;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.layouts.FlowLayout;
import org.beanizer.j2me.charts.ChartItem;
import org.beanizer.j2me.charts.PieChart;
public class PieChartDemo implements ActionListener {
public Form form = new Form("VBarChartDemo");
private Command backCommand = new Command("Back", 1);
final PieChart pieChart = new PieChart("");
PieChartDemo() {
//饼图说明
String chart_str[] = {"█ A:你好吗", "█ B:早上好", "█ C:中午好", "█ D:晚上好", "█ E:吃宵夜", "█ F:睡懒觉"};
//饼图颜色
int[][] color = {{0, 0, 200}, {0, 200, 0}, {50, 15, 30}, {100, 0, 200}, {0, 200, 100}, {200, 100, 200}};
//饼图范围
int[] percent = {15, 10, 5, 20, 34, 16};
//绘制柱体的说明
}
}
```
重构后的代码如下:
```java
private void initChartInfo(String[] chart_str, int[][] color) {
for (int i = 0; i < chart_str.length; i++) { // 循环
Label chart_info = new Label(chart_str[i]);
chart_info.getStyle().setFgColor(UIDemoMIDlet.RGBtoInt(color[i][0], color[i][1], color[i][2]));
form.addComponent(chart_info);
}
}
private Image drawPieChart(ChartItem item, int width, int height, String imagefile, int[][] color, int[] percent) {
item.setFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);
item.setDrawAxis(true);
return pieChart.createImage(width, height);
}
// 在initChartInfo方法中创建按钮并添加到表单中
private void initChartInfoWithButton(String[] chart_str, int[][] color) {
int width = form.getWidth();
int height = form.getHeight() - 60;
Image img_hbarChart = drawPieChart(pieChart, width, height, "", color, percent); // 绘制柱体图
Button button = new Button(img_hbarChart);
button.getStyle().setBgTransparency(1); // 透明背景,会非常消耗资源,速度减慢,注意使用
button.setBorderPainted(false);
form.addComponent(button);
form.addCommand(backCommand);
form.setCommandListener(this);
form.setLayout(new FlowLayout()); // 必须使用这种排列,FlowLayout最适合
}
```
这段代码主要用于设置饼图的大小、添加阴影特效、设置颜色等属性。以下是重构后的代码:
```java
// 设置chart控件的大小,饼图必须width=height
item.setPreferredSize(width - 80, width - 80);
// 需要使用背景时,读取背景图并设置到chart控件上
if (imagefile.length() > 0) {
try {
javax.microedition.lcdui.Image img = javax.microedition.lcdui.Image.createImage(imagefile);
item.setBackgroundImage(img);
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 使用阴影特效
item.showShadow(true);
item.setShadowColor(20, 20, 20);
item.setColor(40, 40, 200);
item.resetData();
for (int i = 0; i < color.length; i++) { // 循环绘画柱体
item.addElement(String.valueOf((char) ('a' + i)), percent[i], color[i][0], color[i][1], color[i][2]);
}
item.setMaxValue(100); // 柱体代表数值的显示范围,100%
// 这个是lcdui的Image
javax.microedition.lcdui.Image lcdui_img = javax.microedition.lcdui.Image.createImage(width, height); //饼图大小,图像>控件
// 这个是lcdui的Graphics
javax.microedition.lcdui.Graphics lcdui_g = lcdui_img.getGraphics();
// 将pieChart绘制到lcdui_g上,并设置位置和大小
pieChart.drawPie(lcdui_g, 40, 40, width - 100, width - 100); // 这里设置的大小必须比width,height小,才能完全显示
// 将lcdui_img转换为lwuit Image并返回
return UIDemoMIDlet.lcdui2lwuit(lcdui_img);
```
这段代码是一个事件处理器,当某个动作事件发生时,它会被调用。在这个例子中,当动作事件的命令是`backCommand`时,它会调用`UIDemoMIDlet.backToMainMenu()`方法,将用户导航回主菜单。
以下是重构后的代码:
```java
public void actionPerformed(ActionEvent arg0) {
if (arg0.getCommand() == backCommand) {
UIDemoMIDlet.backToMainMenu();
}
}
```
重构后的代码使用了更简洁的代码结构,将条件判断和调用的方法分开,使得代码更加易读和易于维护。