java - 绘制具有给定厚度、位置和半径的环。 (Java2D)

标签 java swing graphics2d java-2d ellipse

我需要画一个给定厚度的环,看起来像这样:

enter image description here

中心必须是透明的,这样它就不会覆盖之前绘制的形状。 (或其他戒指)我试过这样的事情:

//g is a Graphics2D object
g.setColor(Color.RED);
g.drawOval(x,y,width,height);
g.setColor(Color.WHITE);
g.drawOval(x+thickness,y+thickness,width-2*thickness,height-2*thickness);

其中画出一个满意的圆环,却覆盖了其他形状;内部是白色的,不透明。我如何修改/重写我的代码以使其不这样做?

最佳答案

您可以创建一个 Area来自 Ellipse2D描述外圈,subtract描述内圆的椭圆。这样,您将获得实际的 Shape可以是 drawnfilled (这仅指环实际覆盖的区域!)。

优点是您确实拥有戒指的几何形状。例如,这允许您检查环形形状 contains 是否某个点,或者用 Paint 填充它这不仅仅是一种颜色:

RingPaint01

这是一个例子,相关部分是createRingShape方法:

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;

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

public class RingPaintTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        RingPaintTestPanel p = new RingPaintTestPanel();
        f.getContentPane().add(p);
        f.setSize(800,800);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}


class RingPaintTestPanel extends JPanel
{
    @Override
    protected void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;

        g.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

        g.setColor(Color.RED);
        g.drawString("Text", 100, 100);
        g.drawString("Text", 300, 100);

        Shape ring = createRingShape(100, 100, 80, 20); 
        g.setColor(Color.CYAN);
        g.fill(ring);
        g.setColor(Color.BLACK);
        g.draw(ring);

        Shape otherRing = createRingShape(300, 100, 80, 20); 
        g.setPaint(new GradientPaint(
            new Point(250, 40), Color.RED, 
            new Point(350, 200), Color.GREEN));
        g.fill(otherRing);
        g.setColor(Color.BLACK);
        g.draw(otherRing);

    }

    private static Shape createRingShape(
        double centerX, double centerY, double outerRadius, double thickness)
    {
        Ellipse2D outer = new Ellipse2D.Double(
            centerX - outerRadius, 
            centerY - outerRadius,
            outerRadius + outerRadius, 
            outerRadius + outerRadius);
        Ellipse2D inner = new Ellipse2D.Double(
            centerX - outerRadius + thickness, 
            centerY - outerRadius + thickness,
            outerRadius + outerRadius - thickness - thickness, 
            outerRadius + outerRadius - thickness - thickness);
        Area area = new Area(outer);
        area.subtract(new Area(inner));
        return area;
    }

}

关于java - 绘制具有给定厚度、位置和半径的环。 (Java2D),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524394/

相关文章:

java - 数学问题(在一个循环内增加和减少两个变量)

java - java 中 PDF 文件的文档模板(寻找工具/库)

java - 如何逐部分绘制图像?

javascript - 多个 Canvas 作为带有 onclick 事件的按钮

java - 提高油漆质量

java - 将照片围绕点 (x,y) 裁剪为 600x600

java - 如何获取 jsoup 链接中的文本?

java - 为什么同步方法不适用于多线程

Applet 和 Java 7 中的 JavaFX - 可能吗?

java - 为什么我不能访问面板的 getWidth() 和 getHeight() 函数?