问题
Seems like as not possible to fix Graphics2D lack in code, there I must to set fix size for animations, otherwise some Start outside Rectangle 490 x 490 freeze or shaking on the screen
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);
}
}
I\'m wish Merry Christmast for all Java contributors here
EDIT:
please change private class Star extends Polygon {
method 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:
The example below creates MAX
ornaments for your tree. It uses a ComponentListener
to relocate any outlying ornaments.
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;
}
}
}
来源:https://stackoverflow.com/questions/8614972/passing-current-date