如何在Java中互锁形状

joh*_*ble 1 java swing paint

我有一个项目,我必须绘制奥林匹克环,我很难让它看起来像环互锁.这是一张显示我的意思的图片.

在此输入图像描述

注意他们如何互锁?这就是我现在想要的,我只有彼此重叠的形状.这就是我现在所拥有的.

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color; //sets color
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.AlphaComposite;

class ColoredOlypmicRings extends JFrame {

    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        float strokeThickness = 27.0f;
        float arcThickness = 9.0f;
        BasicStroke Outline = new BasicStroke(strokeThickness);
        BasicStroke arcOutline = new BasicStroke(arcThickness);
        g2d.setStroke(Outline);
        g2d.setColor(Color.blue);
        g2d.drawOval(100, 100, 300, 300);
        g2d.setColor(Color.yellow);
        g2d.drawOval(265, 300, 300, 300);
        g2d.setColor(Color.black);
        g2d.drawOval(430, 100, 300, 300);
        g2d.setColor(Color.green);
        g2d.drawOval(595, 300, 300, 300);
        g2d.setColor(Color.red);
        g2d.drawOval(760, 100, 300, 300);
        g2d.setStroke(arcOutline);
        g2d.setColor(Color.white);
        g2d.drawArc(253, 378, 50, 75, -230, 58); // -270 start
        g2d.drawArc(290, 370, 50, 75, -230, 58);
        g2d.drawArc(360, 285, 50, 75, -230, 58);
        g2d.drawArc(405, 285, 50, 75, -230, 58);

    }

    public ColoredOlypmicRings() {
        setSize(1200, 800);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        ColoredOlypmicRings guiWindow = new ColoredOlypmicRings();
        guiWindow.setVisible(true);
    }

}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 5

  1. 绘制颜色的弧形,组合形成圆形而不是绘制整个椭圆形.
  2. 最后一层需要绘制顶层弧.这可能需要一些试验和错误,但您可以这样做.
  3. 一般建议永远不要在顶级窗口中绘制,例如JFrame.
  4. 而是在JPanel的paintComponent方法中绘制,然后在JFrame中显示该JPanel
  5. 总是在被覆盖的方法中调用super的绘画方法.
  6. 使用Graphics2D setRenderingHints平滑绘图并打开消除锯齿功能.

第一次迭代 - 尚未完全修复:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;

import javax.swing.*;

@SuppressWarnings("serial")
public class OlympicRings extends JPanel {
    private static final Color BG = Color.WHITE;
    private static final int OVAL_WIDTH = 300;
    private static final int OVAL_HEIGHT = OVAL_WIDTH;
    private static final int X_START = 100;
    private static final int Y_START = X_START;
    private static final int DELTA_X = 175;
    private static final int DELTA_Y = 180;
    private static final Color COLOR_GOLD = new Color(242, 205, 25);
    private static final Stroke INNER_STROKE = new BasicStroke(30f);
    private static final Stroke OUTER_STROKE = new BasicStroke(40f);
    private static final int ARC_LENGTH = 30;
    private static final int CIRCLE_DEGREES = 360;

    public OlympicRings() {
        setBackground(BG);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        int x = X_START;
        int y = Y_START;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH);
        x += DELTA_X;
        y += DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH);        
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH);        
        x += DELTA_X;
        y += DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH);        
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.RED, OVAL_WIDTH);

        x = X_START;
        y = Y_START;
        int angle = CIRCLE_DEGREES - ARC_LENGTH;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH);
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 0, ARC_LENGTH);
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);        
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 0, ARC_LENGTH);        

        g2.dispose();        
    }

    private void myDrawArc(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y,
            Color bg2, Color color, int ovalWidth, int start, int end) {
        g2.setStroke(outerStroke);
        g2.setColor(bg2);
        g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);

        g2.setStroke(innerStroke);
        g2.setColor(color);
        g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);        
    }

    private void myDrawOval(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y,
            Color bg2, Color color, int ovalWidth) {
        g2.setStroke(outerStroke);
        g2.setColor(bg2);
        g2.drawOval(x, y, ovalWidth, ovalWidth);

        g2.setStroke(innerStroke);
        g2.setColor(color);
        g2.drawOval(x, y, ovalWidth, ovalWidth);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        int w = 2 * X_START + DELTA_X * 4 + OVAL_WIDTH;
        int h = 2 * Y_START + DELTA_Y + OVAL_HEIGHT;
        return new Dimension(w, h);
    }

    private static void createAndShowGui() {
        OlympicRings mainPanel = new OlympicRings();

        JFrame frame = new JFrame("OlympicRings");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我的背景笔划超出了弧的末端,因此并不完全存在:

在此输入图像描述

还在努力.

稍微好一些:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;

import javax.swing.*;

@SuppressWarnings("serial")
public class OlympicRings extends JPanel {
    private static final Color BG = Color.WHITE;
    private static final int OVAL_WIDTH = 300;
    private static final int OVAL_HEIGHT = OVAL_WIDTH;
    private static final int X_START = 100;
    private static final int Y_START = X_START;
    private static final int DELTA_X = 175;
    private static final int DELTA_Y = 180;
    private static final Color COLOR_GOLD = new Color(242, 205, 25);
    private static final Stroke INNER_STROKE = new BasicStroke(30f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND);
    private static final Stroke OUTER_STROKE = new BasicStroke(40f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
    private static final int ARC_LENGTH = 30;
    private static final int CIRCLE_DEGREES = 360;

    public OlympicRings() {
        setBackground(BG);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        int x = X_START;
        int y = Y_START;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH);
        x += DELTA_X;
        y += DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH);        
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH);        
        x += DELTA_X;
        y += DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH);        
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawOval(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.RED, OVAL_WIDTH);

        x = X_START;
        y = Y_START;
        int angle = CIRCLE_DEGREES - ARC_LENGTH;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH);
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 0, ARC_LENGTH);
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);        
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 0, ARC_LENGTH);        

        g2.dispose();        
    }

    private void myDrawArc(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y,
            Color bg2, Color color, int ovalWidth, int start, int end) {
        g2.setStroke(outerStroke);
        g2.setColor(bg2);
        g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);

        g2.setStroke(innerStroke);
        g2.setColor(color);
        g2.drawArc(x, y, ovalWidth, ovalWidth, start, end);        
    }

    private void myDrawOval(Graphics2D g2, Stroke innerStroke, Stroke outerStroke, int x, int y,
            Color bg2, Color color, int ovalWidth) {
        g2.setStroke(outerStroke);
        g2.setColor(bg2);
        g2.drawOval(x, y, ovalWidth, ovalWidth);

        g2.setStroke(innerStroke);
        g2.setColor(color);
        g2.drawOval(x, y, ovalWidth, ovalWidth);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        int w = 2 * X_START + DELTA_X * 4 + OVAL_WIDTH;
        int h = 2 * Y_START + DELTA_Y + OVAL_HEIGHT;
        return new Dimension(w, h);
    }

    private static void createAndShowGui() {
        OlympicRings mainPanel = new OlympicRings();

        JFrame frame = new JFrame("OlympicRings");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最新变化:

        x = X_START;
        y = Y_START;
        int angle = CIRCLE_DEGREES - ARC_LENGTH;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLUE, OVAL_WIDTH, angle, ARC_LENGTH);
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, COLOR_GOLD, OVAL_WIDTH, 57, ARC_LENGTH);
        x += DELTA_X;
        y -= DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.BLACK, OVAL_WIDTH, angle, ARC_LENGTH);        
        x += DELTA_X;
        y += DELTA_Y;
        myDrawArc(g2, INNER_STROKE, OUTER_STROKE, x, y, BG, Color.GREEN.darker(), OVAL_WIDTH, 57, ARC_LENGTH);  
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述