01:import java.awt.*;
02:import java.awt.event.*;
03:import javax.swing.* ;
04:
05:class Twinkle4 extends JPanel implements Runnable {
06:	Color bc = new Color(0, 0, 128);        // 背景色 : Navy Blue
07:	Color pc = new Color(181, 166,  66);    // 図形の色 : Brass
08:	Color dc = bc;                          // 表示色
09:	boolean stop = false;                   // 表示停止フラグ
10:
11:	public Twinkle4() {
12:		setBackground(bc);                                 // 背景色を指定
13:		setLayout(new BorderLayout());                     // center と south を使用
14:		final JColorChooser chooser = new JColorChooser(); // 表示色の選択用
15:		final JButton button = new JButton("color");       // 表示色選択ボタン
16:		button.addActionListener(new ActionListener() {
17:			public void actionPerformed(ActionEvent e) {
18:				Color c = chooser.showDialog(null, "draw color", pc);
19:				if(c!=null) pc = c;                        // 色が指定されたら変更
20:			}
21:		});
22:		final JButton sbutton = new JButton("stop");       // 表示停止ボタン
23:		sbutton.addActionListener(new ActionListener() {
24:			public void actionPerformed(ActionEvent e) {
25:				if(stop) {
26:					stop = false;                          //
27:					sbutton.setText("stop");               //
28:				} else {
29:					stop = true;                           //
30:					sbutton.setText("go");                 //
31:				}
32:			}
33:		});
34:		JPanel pan = new JPanel();
35:		pan.add(button);                                   // 色選択ボタンの貼り付け
36:		pan.add(sbutton);                                  // 表示停止ボタンの貼り付け
37:		add(pan, BorderLayout.SOUTH);                      // 2つのボタンを貼り付け
38:		Thread thread = new Thread(this);                  // スレッドの生成
39:		thread.start();                                    // スレッドの起動
40:	}
41:
42:	public void paintComponent(Graphics g) {
43:		super.paintComponent(g);
44:		int w = getWidth();
45:		int h = getHeight();
46:		int r = (w+h)/8;
47:		int x = w/2-r;
48:		int y = h/2-r-18;
49:		g.setColor(dc);                            // bc か pc のいずれか
50:		g.fillOval(x,y,2*r,2*r);                   //
51:	}
52:
53:	public void run() {
54:		while(true){
55:			try {                                  //
56:				Thread.sleep(300);                 // 0.2 秒停止
57:			}                                      //
58:			catch(InterruptedException e) {        //
59:				e.printStackTrace();               //
60:			}                                      //
61:			if(!stop) {
62:				dc = pc;                     //
63:				repaint();                             // 表示開始
64:				try {                                  //
65:					Thread.sleep(1000);                // 1 秒間表示
66:				}                                      //
67:				catch(InterruptedException e) {        //
68:					e.printStackTrace();               //
69:				}                                      //
70:				dc = bc;                               //
71:				repaint();                             // 表示終了
72:			}
73:		}
74:	}
75:
76:	public static void main(String args[]) {
77:		JFrame frame = new JFrame("Twinkle");              // 外側のフレーム
78:		frame.addWindowListener(new WindowAdapter() {
79:			public void windowClosing(WindowEvent e) { System.exit(0); }
80:		});
81:		Container container = frame.getContentPane();      // コンテントペインの獲得
82:		container.setLayout(new GridLayout(0,3,2,2));      // 3列に表示
83:		int npanel = 6;
84:		if(args.length>0) npanel = Integer.parseInt(args[0]);
85:		for(int i=0; i<npanel; i++) {
86:			container.add( new Twinkle4() );
87:		}
88:		frame.setSize(600,500);                            // 
89:		frame.setVisible(true);                            // フレームの表示
90:	}
91:}