import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JFrame { public static void main(String[] args) { new Main(); } WavePanel panel = new WavePanel(); public Main() { setDefaultCloseOperation(EXIT_ON_CLOSE); setLayout(new BorderLayout()); add(panel); pack(); setLocationRelativeTo(null); setVisible(true); new Thread(new Runnable() { public void run() { try { while (true) { Thread.sleep(100); panel.repaint(); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } class WavePanel extends JPanel { final int bufWidth = 400, bufHeight = 200; final int len = 100; final int lifeLine = (int) (bufWidth * 0.75); final int midHeight = bufHeight >> 1; final int perw = lifeLine / len; final BufferedImage buf = new BufferedImage(bufWidth, bufHeight, BufferedImage.TYPE_INT_ARGB); final int a[] = new int[len]; final Random random = new Random(); public int ai = 0; public WavePanel() { setPreferredSize(new Dimension(bufWidth, bufHeight)); } @Override protected void paintComponent(Graphics g) { ai = (ai + 1) % len; a[ai] = random.nextInt(100); Graphics gg = buf.getGraphics(); gg.clearRect(0, 0, buf.getWidth(), buf.getHeight()); gg.setColor(Color.RED); for (int i = 0; i < len; i++) { int j = (ai - i + len) % len; int leftSpace = perw / 3; int x = lifeLine - i * perw; int y = midHeight - (a[j] >> 1); int w = (int) (0.6 * perw), h = a[j]; gg.fillRect(x - leftSpace, y, w, h); } gg.setColor(Color.CYAN); gg.drawLine(lifeLine, 0, lifeLine, bufHeight - 1); g.drawImage(buf, 0, 0, null); } } }