Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中互锁形状_Java_Swing_Paint - Fatal编程技术网

如何在Java中互锁形状

如何在Java中互锁形状,java,swing,paint,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

我有一个项目,我必须画奥运五环,我很难让它看起来像一个环。这是一张显示我意思的图片

注意到它们是如何互锁的吗?这就是我现在想要的,我只想让这些形状彼此重叠。这就是我现在拥有的

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);
    }

}
  • 绘制颜色的圆弧,当它们组合在一起时形成圆,而不是绘制整个椭圆
  • 最顶层的圆弧需要最后绘制。这可能需要一些尝试和错误,但您可以做到这一点
  • 一般建议不要在顶级窗口(如JFrame)中绘制
  • 而是在JPanel的paintComponent方法中绘制,然后在JFrame中显示该JPanel
  • 始终在重写的方法中调用super的绘画方法
  • 使用Graphics2D SetRenderingHits平滑图形,并启用抗锯齿
  • 第一次迭代--尚未完全修复:

    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();
            });
        }
    }
    
    这并不完全存在,因为我的背景笔划超出了弧的末端:

    还在努力

    稍微好一点:

    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();
            });
        }
    }
    

    最新更改:

            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);  
    
    结果是:

  • 绘制颜色的圆弧,当它们组合在一起时形成圆,而不是绘制整个椭圆
  • 最顶层的圆弧需要最后绘制。这可能需要一些尝试和错误,但您可以做到这一点
  • 一般建议不要在顶级窗口(如JFrame)中绘制
  • 而是在JPanel的paintComponent方法中绘制,然后在JFrame中显示该JPanel
  • 始终在重写的方法中调用super的绘画方法
  • 使用Graphics2D SetRenderingHits平滑图形,并启用抗锯齿
  • 第一次迭代--尚未完全修复:

    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();
            });
        }
    }
    
    这并不完全存在,因为我的背景笔划超出了弧的末端:

    还在努力

    稍微好一点:

    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();
            });
        }
    }
    

    最新更改:

            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);  
    
    结果是:


    这是OP发布的代码的输出:

    环周围的白色边框-不应仅在环相互交叉时才尝试硬编码边框,而应在绘制任何彩色弧之前绘制白色弧,白色弧的笔划比彩色弧宽

    重叠-如果您一个接一个地绘制所有环,则必须修复至少4个重叠,使其看起来像您要的徽标。您应该通过仅重画相应的圆弧部分来重新绘制这4个重叠(蓝色覆盖黄色、黄色覆盖黑色、黑色覆盖绿色、绿色覆盖红色)中的每一个

    颜色和距离-使用颜色选择器工具从示例图像中查找所需颜色的精确RGB值。你也应该把你的戒指水平地隔开一点,把最上面的一行画得离最下面的一行更近


    编辑:按照我自己的建议,这里是我的输出

    以及生成它的程序(导入语句ommitted)


    这是OP发布的代码的输出:

    环周围的白色边框-不应仅在环相互交叉时才尝试硬编码边框,而应在绘制任何彩色弧之前绘制白色弧,白色弧的笔划比彩色弧宽

    重叠-如果您一个接一个地绘制所有环,则必须修复至少4个重叠,使其看起来像您要的徽标。您应该通过仅重画相应的圆弧部分来重新绘制这4个重叠(蓝色覆盖黄色、黄色覆盖黑色、黑色覆盖绿色、绿色覆盖红色)中的每一个

    颜色和距离-使用颜色选择器工具从示例图像中查找所需颜色的精确RGB值。你也应该把你的戒指水平地隔开一点,把最上面的一行画得离最下面的一行更近


    编辑:按照我自己的建议,这里是我的输出

    以及生成它的程序(导入语句ommitted)


    例如,等等……例如,等等……黄色圆圈上部的弧是错误的,这是OP发布的代码-我只是在我的答案中显示它来评论它。黄色圆圈上部的弧是错误的,这是OP发布的代码-我只是在我的答案中显示它来评论它