Java:创建有洞的剪辑区域?

时间:2011-06-08 14:55:02

标签: java clipping

如何定义一个有空洞的剪裁区域(通过Graphics2D.clip(Shape))?

例如:一个矩形r1减去r1内的另一个矩形r2

我确信这有一个简单的答案,但我画的是空白。

3 个答案:

答案 0 :(得分:4)

Path2D.append() + EVEN_ODD缠绕规则似乎可以解决问题:

enter image description here

package com.example.test.gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class HoleClipper extends JPanel
{
    @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Rectangle2D r1 = getBounds();
        int margin = 50;
        Rectangle2D r2 = new Rectangle2D.Double(
                r1.getMinX()+margin,
                r1.getMinY()+margin,
                r1.getWidth()-2*margin,
                r1.getHeight()-2*margin);

        g2d.setColor(Color.YELLOW);
        g2d.fill(r1);

        Path2D p = new Path2D.Double(Path2D.WIND_EVEN_ODD);
        p.append(r1, false);
        p.append(r2, false);
        g2d.clip(p);

        int spacing = 10;
        g2d.setColor(Color.BLACK);
        for (double d = 0; d < r1.getWidth() + r1.getHeight(); d += spacing)
        {
            Line2D line = new Line2D.Double(0, d, d, 0);
            g2d.draw(line);
        }
    }

    public static void main(String[] args) {
        HoleClipper clipper = new HoleClipper();
        clipper.setPreferredSize(new Dimension(300, 200));

        JFrame frame = new JFrame("HoleClipper");
        frame.setContentPane(clipper);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

答案 1 :(得分:2)

图形的setClip看起来不支持此功能。当我阅读文档时,所有支持的矩形都是:

public abstract void setClip(Shape clip)

将当前剪裁区域设置为任意剪辑形状。并非所有实现Shape接口的对象都可用于设置剪辑。唯一可以保证支持的Shape对象是通过 getClip方法和Rectangle对象获得的Shape对象。此方法设置用户剪辑,该剪辑独立于与设备边界关联的剪辑和窗口可见性。

答案 2 :(得分:1)

GeneralPath类是Shape的一种实现,可以表示带有洞的形状。您可以定义多个路径段,一个表示“外部”,另一个表示“孔”。使用GeneralPath定义所需的剪辑区域,然后调用clip()

相关问题