这个类用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();
}
}
}

解决方案 »

  1.   

    缩进都没有了,有办法在csdn论坛显示缩进吗?
    要是实在没办法,大家就凑活着看吧。
      

  2.   

    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();
    }
    }
    }
      

  3.   

    这个程序首先违反了 SRP(单一职责原则),也就是说,一个类应该只有一类的功能,而不能含有多个类的功能,你这个类包含了:配置文件解析、绘图用的数据集生成、图像处理、图像持久化几大功能点了。