第一次迭代 - 尚未完全固定的:
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);
和结果:
挂在例如... .. –