今日制作一地图程序,用到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度斜线填充
        
    }
}

解决方案 »

  1.   

    画上红框,画上斜线。你可以参考一下java图形编程(大致是这个书名),上面有怎么在指定区域绘制斜线,区域外的斜线不显示
      

  2.   

    一个循环不就搞定了。否则还要用setPaint+setClip方法解决,还要自己实现一个斜线的Paint,太麻烦了。
      

  3.   

    不是自己实现,Graphics2D里面应该有现成的方法,只是我不知道怎么写,我上面发的那个链接里面已经有效果图了,可以填充渐变色和图形底纹样式,我相信填充斜线应该也是可以的,不知道哪位高手曾经做过
      

  4.   

    渐变色可以用LinearGradientPaint,图形纹理可以用TexturePaint
    斜线没有现成的,或则用图形纹理代替?
      

  5.   

    填充的形状是由setClip(Shape clip) 控制的,和TexturePaint没有直接关系
      

  6.   

    问题终于解决,虽然绘制出的平行线不是斜的而是水平的,但已经基本满足要求了,谢谢各位    public static void drawSelPolygon(Graphics2D g2, Color frameColor, int[] x, int[] y, int numPoints) {
            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);
        }
      

  7.   

    最完美的解决方案public static void drawSelPolygon(Graphics2D g2, Color frameColor, int[] x, int[] y,
            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);
    }