内部使用Java图形裁剪(Inside clipping with Java Graphics)

2019-06-28 08:48发布

我需要绘制使用java.awt.Graphics一条线,但只有位于矩形的线外的部分应该呈现。

是否可以使用图形裁剪支持或是否需要计算交点和剪辑行自己?

Answer 1:

您需要使用的区域类。 这个例子将演示如何执行你的要求:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test extends JPanel {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        Test t = new Test();
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(t,BorderLayout.CENTER);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public Test() {
        setPreferredSize(new Dimension(300, 300));
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g.create();
        Rectangle2D rectangleNotToDrawIn = new Rectangle2D.Double(100, 100, 20, 30);
        Area outside = calculateRectOutside(rectangleNotToDrawIn);
        g2.setPaint(Color.white);
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setPaint(Color.black);
        g2.setClip(outside);
        g2.drawLine(0, 0, getWidth(), getHeight());

    }


    private Area calculateRectOutside(Rectangle2D r) {
        Area outside = new Area(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
        outside.subtract(new Area(r));
        return outside;
    }

}


Answer 2:

您可以与AWT剪辑做到这一点。 你需要知道你要排除的矩形的界限,你的绘图区域的外部边界。

下面的演示代码打开一个帧和在它显示单个面板。 该小组的paint方法树立了典范剪辑,看起来像在中间的矩形孔的矩形,而事实上,它是一种描述我们周围要排除的区域面积的多边形。 剪裁矩形应该由排除矩形,绘图区域的外缘的界限,但我左硬编码值,以保持它的简单和说明该动作更好的(我希望!)

+-------------------+
| clip drawing area |
+---+-----------+   |
|   | excluded  |   |
|   |   area    |   |
|   +-----------+   |
|                   |
+-------------------+

该方法具有比在,它可以防止所有AWT绘画进入被排除的区域手动地计算线交叉点的益处。 我不知道这是否对你有用。

我的演示,然后画在整个区域一个黑色的矩形,并通过它运行一个单一的白色对角线,说明剪辑工作。

public class StackOverflow extends JFrame {
    public static void main(String[] args) {
        new StackOverflow();
    }

    private StackOverflow() {
        setTitle( "Clip with a hole" );
        setSize( 320,300 );
        getContentPane().add( new ClipPanel() );
        setVisible( true );
    }
}

class ClipPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Polygon clip = new Polygon(
                new int[]{ 0, 100, 100,  0,  0, 20, 20, 80, 80,  0 },
                new int[]{ 0,   0,  60, 60, 20, 20, 40, 40, 20, 20 },
                10
            );
        g.setClip(clip);
        g.setColor( Color.BLACK );
        g.fillRect( 0,0,100,60 );
        g.setColor( Color.WHITE );
        g.drawLine( 0,0,100,60 );
    }
}


文章来源: Inside clipping with Java Graphics