JavaのSwing


アニメ『ドルアーガの塔 ~the Aegis of URUK~』(2008)

見たいアニメが放送されるのを待ってる間、暇なので、過去のアニメを見ます。忘れっぽい私にとって、十年前のアニメなんてのは、新作同様です。ドルアーガの塔、一話目に、まんまとやられました(何度かやられてます)。あ~、こんなことあったなあ、と。このアニメは2話目からが本番ですね。アニメも面白いですが、OPがノリが好きです。SWINGINGという曲を初めて聞いたとき、リンドバーグ復活したんだあ、なんて勘違いしてました。リンドバーグではなくてムラマサ☆というバンドだったのですが、残念ながら2009年に解散してました。

曲名がSWINGINGということで、気まぐれにより、今回はJavaでSwingです。
Swingは何かの頭文字の集合で、きっとSはJavaを作ったSun MicrosystemsのSではなかろうか、そしてW、I、N、G、きっと、何かすごい意味があるのだろう。ずっと誤解してました。なんてことはない。SwingはスイングダンスのSwingなんですね。
さて、Swingで何を作りましょう。はい、やはり三並べですね。

ではJFrameを表示してみます。

takk@deb9:~$ cat -n test1.java
     1	import javax.swing.*;
     2	
     3	class Test{
     4		public static void main(String args[]){
     5			JFrame app = new JFrame();
     6			app.setVisible(true);
     7			app.setSize(333,333);
     8		}
     9	}

実行するには、javacしてjavaコマンド使うだけです。

takk@deb9:~$ javac test1.java
takk@deb9:~$ java Test

TestクラスをJFrameから派生させることにします。やってることはさきほどと同じですね。

takk@deb9:~$ cat -n test2.java
     1	import javax.swing.*;
     2	
     3	class Test extends JFrame{
     4		public static void main(String args[]){
     5			Test app = new Test();
     6		}
     7		Test(){
     8			this.setVisible(true);
     9			this.setSize(333,333);
    10		}
    11	}

実行しても同じようにフレームが表示されるだけです。

takk@deb9:~$ javac test2.java
takk@deb9:~$ java Test


ところで、表示されるフレームを終了しようとしても、プロセスが動作したままなので、コマンドラインからCtrl+Cを押して停止させていたと思います。
次は、右上の×ボタンがクリックされたら、終了するように改造します。
イベントを使うので、AWTのイベントを使います。

takk@deb9:~$ cat -n test3.java
     1	import javax.swing.*;
     2	import java.awt.event.*;
     3	
     4	class Test extends JFrame{
     5		public static void main(String args[]){
     6			Test app = new Test();
     7		}
     8		Test(){
     9			this.setVisible(true);
    10			this.setSize(333,333);
    11			this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    12			this.addWindowListener(new WindowAdapter(){
    13				public void windowClosing(WindowEvent e){
    14					System.exit(0);
    15				}
    16			});
    17		}
    18	}
takk@deb9:~$ javac test3.java
takk@deb9:~$ java Test


表示は代り映えしませんが、きれいに終了するようになりましたね。

次は三並べ用の盤を作るため、GridLayoutを使って3 x 3のパネルを用意します。

takk@deb9:~$ cat -n test4.java
     1	import javax.swing.*;
     2	import java.awt.*;
     3	import java.awt.event.*;
     4	
     5	class Test extends JFrame{
     6		public static void main(String args[]){
     7			Test app = new Test();
     8		}
     9		int x = 3;
    10		int y = 3;
    11		MyPanel[] myPanel = new MyPanel[x*y];
    12		Test(){
    13			this.setVisible(true);
    14			this.setSize(333,333);
    15			this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    16			this.addWindowListener(new WindowAdapter(){
    17				public void windowClosing(WindowEvent e){
    18					System.exit(0);
    19				}
    20			});
    21			setLayout(new GridLayout(y,x));
    22			for(int i = 0; i < myPanel.length; i++){
    23				myPanel[i] = new MyPanel();
    24				add(myPanel[i]);
    25			}
    26		}
    27		class MyPanel extends JPanel {
    28		}
    29	}
takk@deb9:~$ javac test4.java
takk@deb9:~$ java Test


パネルを9個はめ込んでますが、目に見えるGUIが配置されていないので、表示は何も変わってませんね。では、各パネルにボタンを載せてみましょう。ボタンをパネルいっぱいに広げて配置するためGridLayoutを1 x 1で使います。

takk@deb9:~$ cat -n test5.java
     1	import javax.swing.*;
     2	import java.awt.*;
     3	import java.awt.event.*;
     4	
     5	class Test extends JFrame{
     6		public static void main(String args[]){
     7			Test app = new Test();
     8		}
     9		int x = 3;
    10		int y = 3;
    11		MyPanel[] myPanel = new MyPanel[x*y];
    12		Test(){

    ~省略~

    26		}
    27		class MyPanel extends JPanel {
    28			JButton bt = new JButton();
    29			MyPanel(){
    30				setLayout(new GridLayout(1,1));
    31				add(bt);
    32			}
    33		}
    34	}
takk@deb9:~$ javac test5.java
takk@deb9:~$ java Test


ボタンが見えるようになりました。

ボタンが押されたら、○×を交互に表示するように処理を追加します。

takk@deb9:~$ cat -n test6.java
     1	import javax.swing.*;
     2	import java.awt.*;
     3	import java.awt.event.*;
     4	
     5	class Test extends JFrame{
     6		public static void main(String args[]){
     7			Test app = new Test();
     8		}
     9		int x = 3;
    10		int y = 3;
    11		MyPanel[] myPanel = new MyPanel[x*y];
    12		boolean toggle = true;
    13		Test(){

    ~省略~

    27		}
    28		class MyPanel extends JPanel implements ActionListener{
    29			JButton bt = new JButton();
    30			boolean already = false;
    31			MyPanel(){
    32				setLayout(new GridLayout(1,1));
    33				add(bt);
    34				bt.addActionListener(this);
    35			}
    36			public void actionPerformed(ActionEvent e){
    37				if(already == false){
    38					if(toggle == true){
    39						bt.setText("○");
    40						toggle = false;
    41					}else{
    42						bt.setText("×");
    43						toggle = true;
    44					}
    45					already = true;
    46				}
    47			}
    48		}
    49	}
takk@deb9:~$ javac test6.java
takk@deb9:~$ java Test


文字が小さいです。さらに処理を追加して、34行目でフォントサイズを変更してます。フォントは何でもよいので省略してます。
65行目から三つ並んだかどうか判定処理もいれてみました。

takk@deb9:~$ cat -n test7.java
     1	import javax.swing.*;
     2	import java.awt.*;
     3	import java.awt.event.*;

    ~省略~

    28		class MyPanel extends JPanel implements ActionListener{
    29			JButton bt = new JButton();
    30			boolean already = false;
    31			MyPanel(){
    32				setLayout(new GridLayout(1,1));
    33				add(bt);
    34				bt.setFont(new Font("",Font.BOLD,40));
    35				bt.addActionListener(this);
    36			}
    37			public void actionPerformed(ActionEvent e){
    38				if(already == false){
    39					if(toggle == true){
    40						bt.setText("○");
    41						toggle = false;
    42					}else{
    43						bt.setText("×");
    44						toggle = true;
    45					}
    46					already = true;
    47					if(judge() == true){
    48						JOptionPane.showMessageDialog(
    49							(Component)null,
    50							"終了します",
    51							"OK",
    52							JOptionPane.INFORMATION_MESSAGE
    53						);
    54						System.exit(0);
    55					}
    56				}
    57			}
    58			String getText(){
    59				return bt.getText();
    60			}
    61			void setRed(){
    62				bt.setForeground(Color.red);
    63			}
    64		}
    65		boolean judge(){
    66			int pattern[][] = {
    67				{0,1,2},
    68				{3,4,5},
    69				{6,7,8},
    70				{0,3,6},
    71				{1,4,7},
    72				{2,5,8},
    73				{0,4,8},
    74				{2,4,6}
    75			};
    76			String str;
    77			MyPanel pan1,pan2,pan3;
    78			for(int i = 0; i < pattern.length; i++){
    79				pan1 =  myPanel[ pattern[i][0] ];
    80				pan2 =  myPanel[ pattern[i][1] ];
    81				pan3 =  myPanel[ pattern[i][2] ];
    82				str  = pan1.getText();
    83				str += pan2.getText();
    84				str += pan3.getText();
    85				if(str.equals("○○○") == true){
    86					pan1.setRed();
    87					pan2.setRed();
    88					pan3.setRed();
    89					return true;
    90				}else if(str.equals("×××") == true){
    91					pan1.setRed();
    92					pan2.setRed();
    93					pan3.setRed();
    94					return true;
    95				}
    96			}
    97			return false;
    98		}
    99	}
takk@deb9:~$ javac test7.java
takk@deb9:~$ java Test

これで人間二人でできる(もしくは一人で両方動かす)三並べはできました。

ムラマサ☆が好きならエイリアンズも好きだと思います。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA