Передача текущей даты

Похоже, что невозможно устранить недостаток Graphics2D в коде, там я должен установить размер исправления для анимаций, в противном случае некоторые начнут за пределами Rectangle 490 x 490 замерзать или трястись на экране

my SSCCE

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;
import java.util.Vector;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.table.*;

public class OneTwoThree implements Runnable {

    private String testS;
    private JFrame frame = new JFrame("frameTitle");
    private JScrollPane tblS = new JScrollPane();
    private JTable tbl;
    private Vector<String> rOrH;
    private long t1 = 0L;
    private long t2 = 0L;
    private AlphaChars aChars = new AlphaChars();
    private GradientViewPortOriginal tableViewPort;
    private JViewport viewport = new JViewport();
    private Random random = new Random();
    private Vector<Vector<Integer>> vec = new Vector<Vector<Integer>>();
    private boolean bolo = false;

    public OneTwoThree() {
        t1 = System.currentTimeMillis();
        int regLenght = 3500;
        int chars = 0;
        testS = aChars.getNext(regLenght);
        rOrH = new Vector<String>();
        Vector<Vector<String>> rowD = new Vector<Vector<String>>();
        for (int e = 0; e < regLenght;) {
            chars++;
            if (chars > 50) {
                chars = 1;
                rowD.add(rOrH);
                rOrH = new Vector<String>();
            }
            String str = (testS.substring(e, (e + 1))).toString();
            if (str != null) {
                rOrH.add(str);
            } else {
                rOrH.add("");
            }
            e++;
        }
        rOrH = new Vector<String>();
        for (int i = 0; i < 50; i++) {
            rOrH.add(String.valueOf(i + 1));
        }
        tbl = new JTable(rowD, rOrH);
        TableColumnModel tcm = tbl.getColumnModel();
        for (int i = 0; i < (tcm.getColumnCount()); i++) {
            tcm.getColumn(i).setPreferredWidth(4);
        }
        tbl.setGridColor(tbl.getBackground());
        tbl.setRowHeight(10);
        tbl.setTableHeader(null);
        tbl.setPreferredScrollableViewportSize(tbl.getPreferredSize());
        tbl.setRowSelectionAllowed(false);
        tbl.setColumnSelectionAllowed(false);
        tableViewPort = new GradientViewPortOriginal(tbl);
        viewport = tableViewPort.getViewport();
        RepaintManager.setCurrentManager(new RepaintManager() {

            @Override
            public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
                Container con = c.getParent();
                while (con instanceof JComponent) {
                    if (!con.isVisible()) {
                        return;
                    }
                    if (con instanceof GradientViewPortOriginal) {
                        c = (JComponent) con;
                        x = 0;
                        y = 0;
                        w = con.getWidth();
                        h = con.getHeight();
                    }
                    con = con.getParent();
                }
                super.addDirtyRegion(c, x, y, w, h);
            }
        });
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tableViewPort, BorderLayout.CENTER);
        frame.setLocation(20, 20);
        frame.pack();
        frame.setVisible(true);
        addColumnRenderes();
        for (int i = 0; i < 35; i++) {
            Star star = new Star(new Point(random.nextInt(490), random.nextInt(490)));
            star.setColor(new Color(100 + random.nextInt(155), 100 + random.nextInt(155), 100 + random.nextInt(155)));
            star.setxIncr(-3 + random.nextInt(7));
            star.setyIncr(-3 + random.nextInt(7));
            tableViewPort.add(star);
        }
    }

    private void addColumnRenderes() {
        for (int i = 0; i < tbl.getColumnCount(); i++) {
            RowColorRenderer rowRenderer = new RowColorRenderer(i);
            TableColumn column = tbl.getColumnModel().getColumn(i);
            column.setCellRenderer(rowRenderer);
        }
        addTableData();
    }

    private void addTableData() {
        tbl.setValueAt("8", 4, 25);tbl.setValueAt("4", 5, 24);tbl.setValueAt("1", 5, 25);tbl.setValueAt("4", 5, 26);
        tbl.setValueAt("4", 6, 23);tbl.setValueAt("4", 6, 25);tbl.setValueAt("1", 6, 26);tbl.setValueAt("4", 6, 27);
        tbl.setValueAt("1", 6, 28);tbl.setValueAt("1", 7, 21);tbl.setValueAt("4", 7, 22);tbl.setValueAt("1", 7, 23);
        tbl.setValueAt("4", 7, 24);tbl.setValueAt("1", 7, 27);tbl.setValueAt("8", 7, 28);tbl.setValueAt("4", 8, 23);
        tbl.setValueAt("1", 8, 24);tbl.setValueAt("1", 8, 25);tbl.setValueAt("8", 8, 26);tbl.setValueAt("8", 8, 27);
        tbl.setValueAt("7", 9, 24);tbl.setValueAt("1", 9, 26);tbl.setValueAt("4", 9, 25);tbl.setValueAt("4", 10, 24);
        tbl.setValueAt("1", 10, 25);tbl.setValueAt("8", 10, 26);tbl.setValueAt("4", 11, 23);tbl.setValueAt("4", 11, 27);
        tbl.setValueAt("1", 12, 21);tbl.setValueAt("4", 12, 22);tbl.setValueAt("8", 12, 28);tbl.setValueAt("4", 13, 21);
        tbl.setValueAt("8", 13, 29);tbl.setValueAt("1", 14, 19);tbl.setValueAt("4", 14, 20);tbl.setValueAt("8", 14, 30);
        tbl.setValueAt("4", 15, 19);tbl.setValueAt("4", 15, 20);tbl.setValueAt("4", 15, 21);tbl.setValueAt("1", 15, 22);
        tbl.setValueAt("4", 15, 23);tbl.setValueAt("1", 15, 31);tbl.setValueAt("1", 15, 32);tbl.setValueAt("4", 16, 22);
        tbl.setValueAt("4", 17, 21);tbl.setValueAt("4", 18, 20);tbl.setValueAt("4", 19, 20);tbl.setValueAt("4", 20, 19);
        tbl.setValueAt("4", 21, 17);tbl.setValueAt("4", 21, 18);tbl.setValueAt("4", 22, 16);tbl.setValueAt("4", 22, 17);
        tbl.setValueAt("4", 22, 18);tbl.setValueAt("4", 22, 19);tbl.setValueAt("4", 22, 20);tbl.setValueAt("4", 24, 18);
        tbl.setValueAt("4", 25, 17);tbl.setValueAt("4", 25, 17);tbl.setValueAt("4", 26, 16);tbl.setValueAt("4", 27, 15);
        tbl.setValueAt("4", 27, 16);tbl.setValueAt("4", 27, 18);tbl.setValueAt("4", 28, 17);tbl.setValueAt("4", 29, 16);
        tbl.setValueAt("4", 30, 15);tbl.setValueAt("4", 31, 14);tbl.setValueAt("4", 32, 13);tbl.setValueAt("4", 33, 12);
        tbl.setValueAt("4", 33, 13);tbl.setValueAt("4", 33, 14);tbl.setValueAt("4", 33, 18);tbl.setValueAt("4", 34, 17);
        tbl.setValueAt("4", 35, 16);tbl.setValueAt("4", 36, 15);tbl.setValueAt("4", 37, 14);tbl.setValueAt("4", 38, 13);
        tbl.setValueAt("4", 39, 12);tbl.setValueAt("4", 40, 11);tbl.setValueAt("4", 41, 10);tbl.setValueAt("4", 42, 9);
        tbl.setValueAt("4", 42, 10);tbl.setValueAt("4", 42, 11);tbl.setValueAt("4", 38, 18);tbl.setValueAt("4", 39, 18);
        tbl.setValueAt("4", 40, 18);tbl.setValueAt("4", 41, 17);tbl.setValueAt("4", 42, 16);tbl.setValueAt("4", 43, 15);
        tbl.setValueAt("4", 44, 14);tbl.setValueAt("4", 46, 13);tbl.setValueAt("4", 47, 12);tbl.setValueAt("4", 48, 11);
        tbl.setValueAt("4", 49, 10);tbl.setValueAt("4", 50, 9);tbl.setValueAt("4", 51, 8);tbl.setValueAt("4", 52, 7);
        tbl.setValueAt("4", 53, 6);tbl.setValueAt("4", 54, 5);tbl.setValueAt("4", 55, 4);tbl.setValueAt("4", 56, 6);
        tbl.setValueAt("4", 56, 8);tbl.setValueAt("4", 56, 9);tbl.setValueAt("4", 56, 10);tbl.setValueAt("4", 56, 12);
        tbl.setValueAt("4", 56, 13);tbl.setValueAt("4", 58, 10);tbl.setValueAt("4", 59, 11);tbl.setValueAt("4", 59, 12);
        tbl.setValueAt("4", 60, 13);tbl.setValueAt("4", 61, 15);tbl.setValueAt("4", 61, 16);tbl.setValueAt("4", 59, 17);
        tbl.setValueAt("4", 58, 18);tbl.setValueAt("4", 57, 19);tbl.setValueAt("4", 62, 18);tbl.setValueAt("4", 63, 19);
        tbl.setValueAt("4", 63, 20);tbl.setValueAt("3", 62, 23);tbl.setValueAt("3", 63, 23);tbl.setValueAt("3", 64, 23);
        tbl.setValueAt("3", 65, 23);tbl.setValueAt("3", 66, 23);tbl.setValueAt("3", 67, 23);tbl.setValueAt("3", 62, 28);
        tbl.setValueAt("3", 63, 28);tbl.setValueAt("3", 64, 28);tbl.setValueAt("3", 65, 28);tbl.setValueAt("3", 66, 28);
        tbl.setValueAt("3", 67, 28);tbl.setValueAt("8", 14, 26);tbl.setValueAt("8", 14, 27);tbl.setValueAt("8", 16, 27);
        tbl.setValueAt("8", 16, 28);tbl.setValueAt("8", 17, 29);tbl.setValueAt("8", 18, 30);tbl.setValueAt("8", 19, 31);
        tbl.setValueAt("8", 20, 32);tbl.setValueAt("8", 21, 31);tbl.setValueAt("8", 22, 30);tbl.setValueAt("8", 22, 29);
        tbl.setValueAt("3", 20, 27);tbl.setValueAt("3", 21, 26);tbl.setValueAt("3", 22, 25);tbl.setValueAt("3", 23, 24);
        tbl.setValueAt("3", 24, 24);tbl.setValueAt("3", 24, 25);tbl.setValueAt("3", 24, 26);tbl.setValueAt("8", 22, 32);
        tbl.setValueAt("8", 23, 33);tbl.setValueAt("8", 24, 34);tbl.setValueAt("8", 25, 35);tbl.setValueAt("8", 26, 36);
        tbl.setValueAt("8", 27, 37);tbl.setValueAt("8", 29, 34);tbl.setValueAt("8", 29, 35);tbl.setValueAt("8", 28, 36);
        tbl.setValueAt("8", 30, 32);tbl.setValueAt("8", 31, 33);tbl.setValueAt("8", 32, 34);tbl.setValueAt("8", 33, 35);
        tbl.setValueAt("8", 34, 36);tbl.setValueAt("8", 34, 37);tbl.setValueAt("3", 27, 30);tbl.setValueAt("3", 28, 29);
        tbl.setValueAt("3", 29, 28);tbl.setValueAt("3", 30, 28);tbl.setValueAt("3", 31, 29);tbl.setValueAt("3", 32, 30);
        tbl.setValueAt("3", 31, 24);tbl.setValueAt("3", 32, 23);tbl.setValueAt("3", 33, 22);tbl.setValueAt("3", 34, 22);
        tbl.setValueAt("3", 34, 23);tbl.setValueAt("3", 34, 24);tbl.setValueAt("3", 37, 20);tbl.setValueAt("3", 38, 19);
        tbl.setValueAt("3", 39, 18);tbl.setValueAt("3", 40, 18);tbl.setValueAt("3", 41, 19);tbl.setValueAt("3", 42, 20);
        tbl.setValueAt("3", 36, 34);tbl.setValueAt("3", 37, 33);tbl.setValueAt("3", 38, 32);tbl.setValueAt("3", 39, 32);
        tbl.setValueAt("3", 39, 33);tbl.setValueAt("3", 39, 34);tbl.setValueAt("3", 40, 24);tbl.setValueAt("3", 41, 23);
        tbl.setValueAt("3", 42, 22);tbl.setValueAt("3", 43, 22);tbl.setValueAt("3", 43, 23);tbl.setValueAt("3", 43, 24);
        tbl.setValueAt("3", 42, 30);tbl.setValueAt("3", 43, 29);tbl.setValueAt("3", 44, 28);tbl.setValueAt("3", 45, 28);
        tbl.setValueAt("3", 46, 29);tbl.setValueAt("3", 47, 30);tbl.setValueAt("3", 50, 21);tbl.setValueAt("3", 51, 20);
        tbl.setValueAt("3", 52, 19);tbl.setValueAt("3", 53, 19);tbl.setValueAt("3", 53, 20);tbl.setValueAt("3", 53, 21);
        tbl.setValueAt("3", 50, 31);tbl.setValueAt("3", 51, 30);tbl.setValueAt("3", 52, 29);tbl.setValueAt("3", 53, 29);
        tbl.setValueAt("3", 53, 30);tbl.setValueAt("3", 53, 31);tbl.setValueAt("3", 47, 15);tbl.setValueAt("3", 48, 14);
        tbl.setValueAt("3", 49, 13);tbl.setValueAt("3", 50, 13);tbl.setValueAt("3", 51, 14);tbl.setValueAt("3", 52, 15);
        tbl.setValueAt("3", 51, 25);tbl.setValueAt("3", 52, 24);tbl.setValueAt("3", 53, 23);tbl.setValueAt("3", 54, 23);
        tbl.setValueAt("3", 55, 24);tbl.setValueAt("3", 46, 25);tbl.setValueAt("3", 50, 38);tbl.setValueAt("3", 51, 37);
        tbl.setValueAt("3", 52, 36);tbl.setValueAt("3", 53, 36);tbl.setValueAt("3", 54, 37);tbl.setValueAt("3", 55, 38);
        tbl.setValueAt("3", 58, 28);tbl.setValueAt("3", 59, 27);tbl.setValueAt("3", 60, 26);tbl.setValueAt("3", 58, 26);
        tbl.setValueAt("3", 59, 27);tbl.setValueAt("3", 60, 28);tbl.setValueAt("8", 37, 36);tbl.setValueAt("8", 38, 37);
        tbl.setValueAt("8", 38, 38);tbl.setValueAt("8", 40, 39);tbl.setValueAt("8", 41, 40);tbl.setValueAt("8", 42, 41);
        tbl.setValueAt("8", 43, 41);tbl.setValueAt("8", 44, 38);tbl.setValueAt("8", 44, 39);tbl.setValueAt("8", 44, 40);
        tbl.setValueAt("8", 43, 35);tbl.setValueAt("8", 44, 36);tbl.setValueAt("8", 45, 37);tbl.setValueAt("8", 46, 38);
        tbl.setValueAt("8", 47, 39);tbl.setValueAt("8", 48, 40);tbl.setValueAt("8", 49, 41);tbl.setValueAt("8", 50, 42);
        tbl.setValueAt("8", 51, 43);tbl.setValueAt("8", 52, 44);tbl.setValueAt("8", 53, 45);tbl.setValueAt("8", 54, 43);
        tbl.setValueAt("8", 55, 42);tbl.setValueAt("8", 56, 41);tbl.setValueAt("8", 59, 31);tbl.setValueAt("8", 60, 32);
        tbl.setValueAt("8", 61, 33);tbl.setValueAt("8", 62, 34);tbl.setValueAt("8", 58, 36);tbl.setValueAt("8", 59, 37);
        tbl.setValueAt("8", 60, 38);tbl.setValueAt("8", 61, 39);tbl.setValueAt("8", 62, 40);tbl.setValueAt("8", 62, 41);
        tbl.setValueAt("8", 60, 35);tbl.setValueAt("8", 61, 36);tbl.setValueAt("8", 62, 37);tbl.setValueAt("8", 58, 45);
        tbl.setValueAt("8", 59, 42);tbl.setValueAt("8", 59, 43);tbl.setValueAt("8", 59, 44);tbl.setValueAt("8", 62, 40);
        frame.setTitle(" - - >   Merry Christmast   < - - ");
        t2 = System.currentTimeMillis();
        System.out.println("miliSec:" + (t2 - t1)); //aver. 32 miliSec.
        new Thread(this).start();
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (!bolo) {
                for (int i = 0; i < 30; i++) {
                    Vector<Integer> vecLocal = new Vector<Integer>();
                    final int r1 = random.nextInt(tbl.getRowCount() - 1);
                    final int c1 = random.nextInt(tbl.getColumnCount() - 1);
                    vecLocal.add(r1);
                    vecLocal.add(c1);
                    vec.add(vecLocal);
                    addSnowFlag();
                    try {
                        Thread.sleep(250);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                bolo = true;
            } else {
                Vector<Integer> vecLocal = new Vector<Integer>();
                final int r = random.nextInt(tbl.getRowCount() - 1);
                final int c = random.nextInt(tbl.getColumnCount() - 1);
                vecLocal.add(r);
                vecLocal.add(c);
                vec.add(vecLocal);
                addSnowFlag();
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void addSnowFlag() {
        if (vec.size() > -1) {
            Vector<Integer> vecLocal = vec.elementAt(vec.size() - 1);
            final int r = vecLocal.elementAt(0);
            final int c = vecLocal.elementAt(1);
            String str = String.valueOf(tbl.getValueAt(r, c));
            if (!str.isEmpty()) {
                if (!Pattern.compile("\\d").matcher(str).find()) {
                    if (!Pattern.compile("[123456789]").matcher(str).find()) {
                        Runnable doRun = new Runnable() {

                            @Override
                            public void run() {
                                tbl.setValueAt("9", r, c);
                            }
                        };
                        SwingUtilities.invokeLater(doRun);
                        if (bolo) {
                            Vector<Integer> vecLocal1 = vec.elementAt(0);
                            final int r1 = vecLocal1.elementAt(0);
                            final int c1 = vecLocal1.elementAt(1);
                            Runnable doRun1 = new Runnable() {

                                @Override
                                public void run() {
                                    tbl.setValueAt(aChars.getNext(1), r1, c1);
                                    vec.removeElementAt(0);
                                }
                            };
                            SwingUtilities.invokeLater(doRun1);
                        }
                    }
                }
            }
        }
    }

    private class GradientViewPortOriginal extends JScrollPane {

        private static final long serialVersionUID = 1L;
        private final int h = 80;
        private BufferedImage img = null;
        private BufferedImage shadow = new BufferedImage(1, h, BufferedImage.TYPE_INT_ARGB);
        private JViewport viewPort;
        private ArrayList<Star> stars = new ArrayList<Star>();

        public GradientViewPortOriginal(JComponent com) {
            super(com);
            viewPort = this.getViewport();
            viewPort.setScrollMode(JViewport.BLIT_SCROLL_MODE);
            viewPort.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
            viewPort.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
            setPreferredSize(this.getPreferredSize());
            paintBackGround(new Color(250, 250, 150));
        }

        public void add(Star star) {
            stars.add(star);
        }
        //
        private Timer timer = new Timer(33, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                for (Star star : stars) {
                    star.move();
                }
                repaint();
            }
        });

        public void startAnimation() {
            if (!timer.isRunning()) {
                timer.start();
            }
        }

        @Override
        public void addNotify() {
            super.addNotify();
            timer.start();
        }

        private void paintBackGround(Color g) {
            Graphics2D g2 = shadow.createGraphics();
            g2.setPaint(g);
            g2.fillRect(0, 0, 1, h);
            g2.setComposite(AlphaComposite.DstIn);
            g2.setPaint(new GradientPaint(0, 0, new Color(0, 0, 0, 0f), 0, h,
                    new Color(0.8f, 0.8f, 0.8f, 0.5f)));
            g2.fillRect(0, 0, 1, h);
            g2.dispose();
        }

        @Override
        public void paint(Graphics g) {
            if (img == null || img.getWidth() != getWidth() || img.getHeight() != getHeight()) {
                img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            }
            Graphics2D g2 = img.createGraphics();
            super.paint(g2);
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            Rectangle bounds = getViewport().getVisibleRect();
            g2.scale(bounds.getWidth(), -1);
            int y = (getColumnHeader() == null) ? 0 : getColumnHeader().getHeight();
            g2.drawImage(shadow, bounds.x, -bounds.y - y - h, null);
            g2.scale(1, -1);
            g2.drawImage(shadow, bounds.x, bounds.y + bounds.height - h + y, null);
            g2.dispose();
            g.drawImage(img, 0, 0, null);
            for (Star star : stars) {
                g.setColor(star.getColor());
                g.fillPolygon(star);
            }
        }
    }

    private class RowColorRenderer extends DefaultTableCellRenderer {

        private static final long serialVersionUID = 1L;
        private int colNo = 0;

        RowColorRenderer(int col) {
            colNo = col;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            Component comp = super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
            if (!isSelected) {
                if (table.getValueAt(row, colNo) != null) {
                    String str = table.getValueAt(row, colNo).toString();
                    if (!str.isEmpty()) {
                        if (Pattern.compile("\\d").matcher(str).find()) {
                            if (((Pattern.compile("[9]").matcher(str).find()))) {
                                setBackground(new Color(250, 250, 150));
                                setForeground(new Color(250, 250, 150));
                                setFont(new Font("Serif", Font.BOLD, 9));
                            } else if (((Pattern.compile("[1]").matcher(str).find()))) {
                                setBackground(tbl.getBackground());
                                setForeground(Color.orange);
                                setFont(new Font("Serif", Font.BOLD, 8));
                            } else {
                                setBackground(tbl.getBackground());
                                setForeground(Color.gray);
                                setFont(new Font("Serif", Font.BOLD, 9));
                            }
                        } else {
                            setBackground(tbl.getBackground());
                            setForeground(Color.lightGray);
                            setFont(new Font("Serif", Font.PLAIN, 6));
                        }
                    }
                }
            }
            setHorizontalAlignment(CENTER);
            return this;
        }
    }

    private class AlphaChars {

        public static final int MIN_LENGTH = 2000;
        private java.util.Random rand = new java.util.Random();
        private char[] AlphaChars = {
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
            'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',};
        /*'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '*', '/', '<', '>', '&',
        '#', '@', '{', '}', '?', ':', '_', '"', '!', ')', '('};*/

        public String getNext() {
            StringBuilder strbuf = new StringBuilder();
            for (int i = 0; i < MIN_LENGTH; i++) {
                strbuf.append(getAlphaChars()[getRand().nextInt(getAlphaChars().length)]);
            }
            return strbuf.toString();
        }

        public String getNext(int reqLenght) {
            StringBuilder strbuf = new StringBuilder();
            for (int i = 0; i < reqLenght; i++) {
                strbuf.append(getAlphaChars()[getRand().nextInt(getAlphaChars().length)]);
            }
            return strbuf.toString();
        }

        public java.util.Random getRand() {
            return rand;
        }

        public void setRand(java.util.Random aRand) {
            rand = aRand;
        }

        public char[] getAlphaChars() {
            return AlphaChars;
        }

        public void setAlphaChars(char[] aAlphaChars) {
            AlphaChars = aAlphaChars;
        }
    }

    private class Star extends Polygon {

        private static final long serialVersionUID = 1L;
        private Point location = null;
        private Color color = Color.YELLOW;
        private int xIncr, yIncr;
        static final int WIDTH = 500, HEIGHT = 500;

        Star(Point location) {
            int x = location.x;
            int y = location.y;
            this.location = location;
            this.addPoint(x, y + 8);
            this.addPoint(x + 8, y + 8);
            this.addPoint(x + 11, y);
            this.addPoint(x + 14, y + 8);
            this.addPoint(x + 22, y + 8);
            this.addPoint(x + 17, y + 12);
            this.addPoint(x + 21, y + 20);
            this.addPoint(x + 11, y + 14);
            this.addPoint(x + 3, y + 20);
            this.addPoint(x + 6, y + 12);
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public void move() {
            if (location.x < 0 || location.x > WIDTH) {
                xIncr = -xIncr;
            }
            if (location.y < 0 || location.y > WIDTH) {
                yIncr = -yIncr;
            }
            translate(xIncr, yIncr);
            location.setLocation(location.x + xIncr, location.y + yIncr);
        }

        public void setxIncr(int xIncr) {
            this.xIncr = xIncr;
        }

        public void setyIncr(int yIncr) {
            this.yIncr = yIncr;
        }

        public Color getColor() {
            return color;
        }
    }

    public static void main(String args[]) {
        Runnable doRun = new Runnable() {

            @Override
            public void run() {
                OneTwoThree hnvit = new OneTwoThree();
            }
        };
        SwingUtilities.invokeLater(doRun);
    }
}

Я хочу, чтобы Merry Christmast для всех разработчиков Java здесь

EDIT:

пожалуйста change private class Star extends Polygon { метод move() to --- >

public void move() {
    if (location.x < 0 || location.x > frame.getContentPane().getWidth() - 20) {
        xIncr = -xIncr;
    }
    if (location.y < 0 || location.y > frame.getContentPane().getHeight() - 20) {
        yIncr = -yIncr;
    }
    translate(xIncr, yIncr);
    location.setLocation(location.x + xIncr, location.y + yIncr);
}

Ответы

Ответ 1

В приведенном ниже примере создаются украшения MAX для вашего дерева. Он использует ComponentListener для перемещения любых внешних украшений.

enter image description here

package merrychristmas;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Baubles extends JPanel implements ActionListener {

    private static final int MAX = 64;
    private static final String TITLE = "Baubles";
    private static final Random rnd = new Random();
    private static final AlphaComposite ac =
        AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f);
    private final Timer timer = new Timer(100, this);
    private final Queue<Bauble> queue = new LinkedList<Bauble>();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame(TITLE);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Baubles dt = new Baubles();
                f.add(dt);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }

    public Baubles() {
        this.setPreferredSize(new Dimension(8 * MAX, 8 * MAX));
        this.addComponentListener(new ComponentAdapter() {

            @Override // relocate any outliers
            public void componentResized(ComponentEvent e) {
                for (Bauble bauble : queue) {
                    if (bauble.x > getWidth() || bauble.y > getHeight()) {
                        bauble.x = rnd.nextInt(getWidth());
                        bauble.y = rnd.nextInt(getHeight());
                    }
                }
            }
        });
        timer.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (queue.isEmpty()) {
            for (int i = 0; i < MAX; i++) {
                queue.add(randomBauble());
            }
        }
        queue.add(randomBauble());
        queue.remove();
        this.repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.black);
        g2d.fillRect(0, 0, getWidth(), this.getHeight());
        g2d.setComposite(ac);
        for (Bauble b : queue) {
            g2d.setColor(b.c);
            g2d.fillOval(b.x, b.y, b.d, b.d);
        }
    }

    private Bauble randomBauble() {
        int x = rnd.nextInt(getWidth());
        int y = rnd.nextInt(getHeight());
        int r = rnd.nextInt(MAX) + MAX / 2;
        Color c = new Color(rnd.nextInt());
        return new Bauble(x, y, r, c);
    }

    private static class Bauble {

        private int x, y, d;
        private Color c;

        public Bauble(int x, int y, int r, Color c) {
            this.x = x - r;
            this.y = y - r;
            this.d = 2 * r;
            this.c = c;
        }
    }
}