Java 在圆内绘制文本的相交区域

Java 在圆内绘制文本的相交区域,java,swing,text,graphics,intersection,Java,Swing,Text,Graphics,Intersection,我想在圆圈上写一篇文章。文本和圆的相交区域必须是不同的颜色 起初我想使用area类,但我不知道如何将文本转换为区域 我仍然不知道如何将文本转换为形状或其他东西 以下是示例图片: void paintComponent(Graphics g){ Ellipse2D myEllipse = new Ellipse2D.Double(20,20,100,100); //i have no idea how to create a text as a shape. //if i was able to

我想在圆圈上写一篇文章。文本和圆的相交区域必须是不同的颜色

起初我想使用area类,但我不知道如何将文本转换为区域

我仍然不知道如何将文本转换为形状或其他东西

以下是示例图片:

void paintComponent(Graphics g){
Ellipse2D myEllipse = new Ellipse2D.Double(20,20,100,100);

//i have no idea how to create a text as a shape.
//if i was able to create a text as a shape,i would name it "myText"

a1.add(new Area(myEllipse));
a2.add(new Area(myText)); 

g2.setColor(Color.red);
g2.fill(myEllipse);

g2.setColor(Color.CYAN);
g2.fill(myText);

a1.intersect(a2);
g2.setColor(Color.BLACK);
g2.fill(a1);

}


画一个圆和画文本是相当简单的。感谢使用Graphics2D方法更改圆圈中文本的颜色

这是密码

package com.ggl.testing;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

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

public class SimplePainting implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("Simple Painting");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        PaintPanel paintPanel = new PaintPanel();
        frame.add(paintPanel);

        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SimplePainting());
    }

    class PaintPanel extends JPanel {

        private static final long serialVersionUID = 
                -5950526117015270963L;

        private Ellipse2D myEllipse = 
                new Ellipse2D.Double(20, 20, 100, 100);

        private String myText = "Testing, one, two, three";

        public PaintPanel() {
            this.setPreferredSize(new Dimension(400, 200));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setXORMode(Color.WHITE);

            g2d.setColor(Color.RED);
            g2d.fill(myEllipse);

            g2d.setColor(Color.CYAN);
            g2d.drawString(myText, 70, 70);

        }
    }

}

喷漆引擎可以自己处理这个问题。查看图形的XOR模式:

在您的示例中,在写入文本之前,必须将XOR颜色设置为白色:

Graphics2D g2 = (Graphics2D) g;

g2.setColor(Color.white);
g2.fillRect(0, 0, getWidth(), getHeight());

g2.setColor(Color.BLUE);
g2.fill(myEllipse);

g2.setColor(Color.red);
g2.setXORMode(Color.white); // Set XOR mode to white
g2.drawString(myText, 70, 70);
要找到正确的XOR颜色可能相当棘手。但是对于,必须对图形的前景、XOR颜色和正在绘制的颜色进行位XOR

对于圆形区域,我们得到:

Foreground = FF 00 00 (red)
XOR-Color  = FF FF FF (white)
Background = 00 00 FF (blue)
----------------------
Result     = 00 FF 00 (green)
和外部:

Foreground = FF 00 00 (red)
XOR-Color  = FF FF FF (white)
Background = FF FF FF (white)
----------------------
Result     = FF 00 00 (red)
更新:

要查找XOR/前景对,可以执行以下操作:

您必须通过XOR组合背景和结果颜色。我们看到,对于这两种情况(椭圆和外部),我们都有

Ellispe: 00 00 FF ^ 00 FF 00 = 00 FF FF
Outside: FF FF FF ^ FF 00 00 = 00 FF FF

因此,我们可以通过XOR选择任何导致
00ff FF
的XOR/前景对。在本例中,我使用了白色和红色,但黑色和青色会产生相同的结果。

你的意思是喜欢吗?我无法添加图像,因为我没有10张照片。这是一张关于一个孩子想要什么的照片。谢谢Gilbert Le Blanc添加图片感谢你的快速回答,但我需要改变文字的颜色在圆圈。我做了很多形状像长方形,椭圆形,椭圆形…但说到课文,我真的不知道谢谢你,Gilbert Le Blanc,我真的很感激所有的答案。一旦我完成我的计划,我将与大家分享here@Murat:当你有机会的时候,接受king_nak的回答。