Animowany symbol JinJang (YinYang)
Jak narysować symbol JinJang (YinYang) pokazałam w tym wpisie.
Symbol można animować.
Klasy
JinJangAnim.java
package jinjang2; import javax.swing.*; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Ellipse2D; public class JinJangAnim extends JPanel { private static final long serialVersionUID = -3120426206998247799L; private final double rozmiar; private final double odstep; private final Color color1; private final Color color2; private double kat = 0.0; /** * Tworzy obiekt typu JinJang * * @param rozmiar double - srednica figury * @param odstep double - odległość figury od lewego i górnego * brzegu komponentu * @param color1 Color - kolor lewej strony. Jeśli nie jest podany * to kolot jest biały * @param color2 Color - color prawej strony. Jeśli jest nie podany to kolor * jest czarny; */ public JinJangAnim(double rozmiar, double odstep, Color color1, Color color2) { this.rozmiar = rozmiar; this.odstep = odstep; if (color1 == null) { this.color1 = Color.WHITE; } else { this.color1 = color1; } if (color2 == null) { this.color2 = Color.BLACK; } else { this.color2 = color2; } this.setBounds(0, 0, (int) odstep + (int) rozmiar, (int) odstep + (int) rozmiar); } @Override public void paintComponent(Graphics g) { AffineTransform at = AffineTransform.getRotateInstance(kat, getWidth() / 2, getHeight() / 2); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setTransform(at); //- Arc2D.Double polkoleLewe = new Arc2D.Double(odstep, odstep, rozmiar, rozmiar, 90, 180, Arc2D.OPEN); g2.setColor(color1); g2.fill(polkoleLewe); // Arc2D.Double polkolePrawe = new Arc2D.Double(odstep, odstep, rozmiar, rozmiar, -90, 180, Arc2D.OPEN); g2.setColor(color2); g2.fill(polkolePrawe); // - Ellipse2D.Double koloGorne = new Ellipse2D.Double( rozmiar / 4.0 + odstep, odstep, rozmiar / 2.0, rozmiar / 2.0); g2.setColor(color1); g2.fill(koloGorne); // - Ellipse2D.Double koloDolne = new Ellipse2D.Double( rozmiar / 4.0 + odstep, rozmiar / 2.0 + odstep, rozmiar / 2.0, rozmiar / 2.0); g2.setColor(color2); g2.fill(koloDolne); // - Ellipse2D.Double kolkoGorne = new Ellipse2D.Double( rozmiar / 2.0 + odstep, rozmiar / 4.0 + odstep, rozmiar / 20.0, rozmiar / 20.0); g2.setColor(color2); g2.fill(kolkoGorne); // - // - Ellipse2D.Double kolkoDolne = new Ellipse2D.Double( rozmiar / 2.0 + odstep, rozmiar / 2.0 + rozmiar / 4.0 + odstep, rozmiar / 20.0, rozmiar / 20.0); g2.setColor(color1); g2.fill(kolkoDolne); double katStep = (Math.PI * 2) / 360; kat += katStep; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } repaint(); } }
Main.java
package jinjang2; import javax.swing.*; import java.awt.*; public class Main extends JFrame { private static final long serialVersionUID = 4648172894076113183L; private static final int FRAME_WIDTH = 550; private static final int FRAME_HEIGHT = 460; private static final Color PLANSZA = new Color(102, 204, 204); public Main() { setLayout(null); int frameY = Toolkit.getDefaultToolkit().getScreenSize().height / 2 - FRAME_HEIGHT / 2; int frameX = Toolkit.getDefaultToolkit().getScreenSize().width / 2 - FRAME_WIDTH / 2; setBounds(frameX, frameY, FRAME_WIDTH, FRAME_HEIGHT); getContentPane().setBackground(PLANSZA); JinJangAnim jjanim = new JinJangAnim(170, 0, Color.WHITE, Color.BLACK); jjanim.setLocation(170, 100); add(jjanim); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Symbol JinJang"); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(Main::new); } }
Wynik
Po uruchomieniu klasy Main.java
zobaczymy symbol JinJang (YinYang) obracający się w prawo.