アニメ『ドルアーガの塔 ~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
これで人間二人でできる(もしくは一人で両方動かす)三並べはできました。
ムラマサ☆が好きならエイリアンズも好きだと思います。
コメント