刚写了一个类,大家帮我看看有没有什么“bad smell”
这个类用JFreeChart 生成一些定制的图表。
大家帮我看看可读性,代码风格,可维护性或者其他方面有没有什么明显的问题,谢谢啦。
package de.vogella.xml.stax.read;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.RingPlot;
import org.jfree.data.general.DefaultPieDataset;
import pizza.model.pizza;
public class PizzaGen {
public static String pizzaFilepath;
public static String pizzaDataFilename;
public static String tempFilepath;
public static int greenScoreValue;
public static int yellowScoreValue;
public static int orangeScoreValue;
public static Color greenColorCode;
public static Color yellowColorCode;
public static Color orangeColorCode;
public static Color redColorCode;
public static int scoreFontsize;
public static final String pizza_CONFIG_FILENAME = "H:/devtemp/workspace-juno-jee32-2012t1/SandBox3/pizza-config.properties";
public static void main(String[] args) {
PizzaGen sg=new PizzaGen();
sg.loadConfig();
sg.generateAllPizzas(pizzaDataFilename);
}
private void generateAllPizzas(String pizzaDataFilename) {
PizzaDataLoader read = new PizzaDataLoader();
List<Pizza> pizzas = read.readPizzas(pizzaDataFilename);
for (Pizza pizza : pizzas) {
generateInnerRing(pizza);
generateOuterRing(pizza);
}
}
private void generateInnerRing(Pizza pizza) {
BufferedImage bi = drawInnerRing(pizza);
try {
ImageIO.write(bi, "PNG",
new File(tempFilepath + "inner-" + pizza.getFilename()));
} catch (IOException ie) {
ie.printStackTrace();
}
}
private void generateOuterRing(Pizza pizza) {
BufferedImage bi = drawOuterRing(pizza);
try {
ImageIO.write(bi, "PNG",
new File(pizzaFilepath + pizza.getFilename()));
} catch (IOException e) {
e.printStackTrace();
}
}
private BufferedImage drawOuterRing(Pizza pizza) {
DefaultPieDataset piedata = initDataSet(pizza);
JFreeChart chart = ChartFactory.createRingChart("", piedata,// data
false,// include legend
false, false);
ImageIcon imageicon = new ImageIcon(tempFilepath + "inner-"
+ pizza.getFilename());
chart.setBackgroundPaint(Color.white);
chart.setBackgroundImage(imageicon.getImage());
chart.setBackgroundImageAlpha(1);
RingPlot plot = (RingPlot) chart.getPlot();
initPlot(plot);
BufferedImage bi = chart.createBufferedImage(240, 240);
// crop JFreeChart image
bi = bi.getSubimage(25, 25, 240 - 50, 240 - 60);
return bi;
}
private BufferedImage drawInnerRing(Pizza pizza) {
BufferedImage bi = new BufferedImage(240, 240,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, 240, 240);
Color innerColor = getInnerColor(pizza);
Ellipse2D e = new Ellipse2D.Double(55, 53, 130, 130);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setPaint(innerColor);
g.fill(e);
Font font = new Font("Arial", Font.BOLD, scoreFontsize);
g.setFont(font);
String message = Integer.toString(pizza.getScore()) + "%";
g.setColor(Color.white);
g.drawString(message, 80, 138);
return bi;
}
private DefaultPieDataset initDataSet(Pizza pizza) {
DefaultPieDataset piedata = new DefaultPieDataset();
// calculate white space
float white = 56f
* (pizza.getGreen() + pizza.getOrange() + pizza.getRed() + pizza
.getYellow()) / (360 - 56);
piedata.insertValue(0, "0white", new Float(white));
piedata.insertValue(1, "1green", pizza.getGreen());
piedata.insertValue(2, "2yellow", pizza.getYellow());
piedata.insertValue(3, "3orange", pizza.getOrange());
piedata.insertValue(4, "4red", pizza.getRed());
return piedata;
}
private void initPlot(RingPlot plot) {
plot.setBackgroundAlpha(0);
plot.setForegroundAlpha(1);
// whether it is circular, or stretched into an elliptical shape
plot.setCircular(true);
plot.setStartAngle(298); // start Angle
plot.setOutlinePaint(Color.white); // outline of box
plot.setSectionDepth(0.23);
plot.setSeparatorsVisible(false); // separator lines
plot.setSectionOutlinesVisible(false); // section Outlines
plot.setSectionPaint("0white", Color.white);
plot.setSectionOutlinePaint("0white", Color.white);
plot.setSectionPaint("1green", greenColorCode);
plot.setSectionPaint("2yellow", yellowColorCode);
plot.setSectionPaint("3orange", orangeColorCode);
plot.setSectionPaint("4red", redColorCode);
plot.setLabelGenerator(null); // null means no labels
plot.setShadowPaint(Color.white);
}
private Color getInnerColor(Pizza pizza) {
Color innerColor;
if (pizza.getScore() < orangeScoreValue) {
innerColor = redColorCode;
} else if (pizza.getScore() < yellowScoreValue) {
innerColor = orangeColorCode;
} else if (pizza.getScore() < greenScoreValue) {
innerColor = yellowColorCode;
} else {
innerColor = greenColorCode;
}
return innerColor;
}
private void loadConfig() {
Properties p = new Properties();
loadConfigFile(PIZZA_CONFIG_FILENAME, p);
pizzaFilepath = p.getProperty("pizzaFilepath");
tempFilepath = p.getProperty("tempFilepath");
pizzaDataFilename = p.getProperty("pizzaDataFilename");
greenScoreValue = Integer.parseInt(p.getProperty("greenScoreValue"));
yellowScoreValue = Integer.parseInt(p.getProperty("yellowScoreValue"));
orangeScoreValue = Integer.parseInt(p.getProperty("orangeScoreValue"));
greenColorCode= new Color(Integer.parseInt(p.getProperty("greenColorCode"),16));
yellowColorCode= new Color(Integer.parseInt(p.getProperty("yellowColorCode"),16));
orangeColorCode= new Color(Integer.parseInt(p.getProperty("orangeColorCode"),16));
redColorCode= new Color(Integer.parseInt(p.getProperty("redColorCode"),16));
scoreFontsize = Integer.parseInt(p.getProperty("scoreFontsize"));
}
private void loadConfigFile(String filename, Properties p) {
try {
InputStream inputStream = new FileInputStream(new File(filename));
p.load(inputStream);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
[解决办法]
LZ重新贴下代码吧,顺便加点注释