今日制作一地图程序,用到Java Graphics2D绘制多边形,有需求为图幅正常状态下只显示边框和纯色填充,被选中后用红色显示边框并且图幅内部除了原有填充色外,还要显示红色的斜45度平行填充线,以区别未选中的图幅,大致的代码如下,在网上查了一些资料,说的也不是很清楚,以前用GDI+的时候直接就提供这样的方法,我相信Java Graphics2D也会提供类似的方法,我还参考了http://hi.baidu.com/sihillver/blog/item/4e9da9fd3c57321409244d1e.html,希望高手指点一二,代码片段如下
public static void drawPolygon(Size size, int[] x, int[] y, int numPoints, boolean isSelected) { BufferedImage image = new BufferedImage(size.getWidth(), size.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Graphics2D g2 = (Graphics2D) g; //图幅填充颜色
Color fillColor = new Color(95, 158, 160);
//图幅边框颜色
Color frameColor = new Color(0, 0, 0);
//选中的图形边框颜色(红色)
Color selFrameColor = new Color(255, 0, 0); //平滑图形边缘
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(fillColor);
g2.fillPolygon(x, y, numPoints);
g2.setColor(frameColor);
g2.drawPolygon(x, y, numPoints); if (isSelected) {
g2.setColor(selFrameColor);
//请问如何实现图形的选中效果,要求以平行的45度斜线填充
}
}
public static void drawPolygon(Size size, int[] x, int[] y, int numPoints, boolean isSelected) { BufferedImage image = new BufferedImage(size.getWidth(), size.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Graphics2D g2 = (Graphics2D) g; //图幅填充颜色
Color fillColor = new Color(95, 158, 160);
//图幅边框颜色
Color frameColor = new Color(0, 0, 0);
//选中的图形边框颜色(红色)
Color selFrameColor = new Color(255, 0, 0); //平滑图形边缘
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(fillColor);
g2.fillPolygon(x, y, numPoints);
g2.setColor(frameColor);
g2.drawPolygon(x, y, numPoints); if (isSelected) {
g2.setColor(selFrameColor);
//请问如何实现图形的选中效果,要求以平行的45度斜线填充
}
}
斜线没有现成的,或则用图形纹理代替?
g2.setColor(frameColor);
//初始化多边形
Polygon p = new Polygon(x, y, numPoints);
//取得多边形外接矩形
Rectangle r = p.getBounds();
//裁切
g2.setClip(p);
//?
g2.setStroke(new BasicStroke(1f));
//绘制填充线
for (int j = r.y; j < r.y + r.height; j = j + 6) {
Line2D line = new Line2D.Float((float) r.x, (float) j, (float) (r.x + r.width), (float) j);
g2.draw(line);
}
//绘制多边形
g2.drawPolygon(p);
}
int numPoints) {
g2.setColor(frameColor);
//初始化多边形
Polygon p = new Polygon(x, y, numPoints);
//取得多边形外接矩形
Rectangle r = p.getBounds();
//裁切
g2.setClip(p);
//绘制填充线
for (int j = r.y; j-r.width < r.y + r.height; j = j + 6) {
//<--NG
Line2D line = new Line2D.Float(r.x, j, (r.x + r.width), j-r.width);
g2.draw(line);
}
//绘制多边形
g2.drawPolygon(p);
}