ウインドウを表示してみる
では、このjavax.swing.JFrameを使ってウインドウを表示させてみましょう。JFrameは、インスタンスを作るだけで新しいウインドウを作ることができます。といっても、ただnewするだけでおしまい、ではありません。ウインドウの大きさを設定したり、クローズボックスをクリックしたらプログラムを終了するようにしたり、作ったウインドウを画面に表示させたり、といった細かな操作が必要となります。
package codezine.java; public class Sample { public static void main(String[] args) { javax.swing.JFrame frame = new javax.swing.JFrame("My Window"); frame.setSize(300,200); frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }

これは、Sampleという名前のpublicなクラスとしてプログラムを作成しましたので「Sample.java」というファイル名で保存します。また、先ほどの「package」を使って、codezine.javaというパッケージにクラスを配置する設定にしました。つまり、どこか適当なところに「codezine」フォルダを作り、その中に「java」フォルダを作って、そこにSample.javaを配置すればいいことになります。
プログラムを作成するときには、コマンドプロンプトを開き、「codezine」フォルダがある場所にカレントディレクトリを移動してから「javac codezine/java/Sample.java」というように記述をしてコンパイルをします。これで、codezine内のjava内にあるSample.javaをコンパイルし、同じ場所にSample.classを作成します。
作成したプログラムを実行する場合は、やはり「codezine」フォルダがある場所から「java codezine.java.Sample」と実行します。くれぐれも「Sample.class」がある場所に移動してjavaコマンドを実行しないでください。パッケージ指定した場所にクラスが見つからないためエラーになってしまいます。
JFrameの基本操作
では、ここで実行している処理について見ていきましょう。まず最初に、JFrameのインスタンスを作成しています。
javax.swing.JFrame frame = new javax.swing.JFrame("My Window");
JFrameはjavax.swingパッケージにありますから、このように面倒でもjavax.swing.JFrameというようにしてクラスを記述しないといけません(ただし、これはもっと簡単にする方法があるので後述します)。JFrameは引数を指定せずにnewすることもできますが、ここではStringの値を1つ引数に指定しました。こうすると、指定したStrngをウインドウのタイトルバーに表示してくれます。
frame.setSize(300,200);
続いて行っているのは、作成したJFrameインスタンスのsetSizeメソッドを呼び出して、ウインドウの大きさを設定する作業です。このsetSizeは引数にそれぞれ横幅と縦幅のドット数を示すint値を指定します。ここでは300×200の大きさにしています。
frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
次に行っているのは、「クローズボックスをクリックしたときの動作」の設定です。このsetDefaultCloseOperationというメソッドは、クローズボックスをクリックしたときにどんな動作をするかを設定するものです。引数には動作の種類を示す値を渡します。これはJFrameの中にあらかじめ利用できる値が用意されているので、その中から選びます。
ここではEXIT_ON_CLOSEという値を設定していますが、これは「クローズボックスをクリックしたらプログラムを終了する」という動作を示す値です。これは「このとおりに書けばいい」と覚えてしまえばいいでしょう。
また、このEXIT_ON_CLOSEは、「JFrame.EXIT_ON_CLOSE」というように、(インスタンスを作らず)クラスから直接指定しています。Javaでは、このようにインスタンスを必要とせず、クラスから直接呼び出すことのできるフィールドやメソッドがあり、「クラスフィールド」「クラスメソッド」と呼ばれています。
このEXIT_ON_CLOSEのように、クラスに用意されている各種の値などは、いちいちインスタンスを作らないと利用できないのでは面倒ですから、クラスフィールドとして用意し、クラスから直接使えるようになっています。まぁ、このクラスフィールドやクラスメソッドについては、とりあえず「こうやって書けば使える」程度にわかっていれば十分でしょう。
frame.setVisible(true);
最後に、「ウインドウを画面に表示させる」という処理をします。実をいえば、newして作成されたJFrameインスタンスによるウインドウは、そのままでは画面には表示されません。JFrameは非表示の状態でウインドウを作成されるためです。各種の設定を行い、「もうこれで画面に表示してOKだ」となったら、setVisibleをすることで表示します。setVisibleは引数にboolean値を指定し、trueならば表示された状態、falseならば非表示の状態になります。
検索パッケージを指定するimport
それにしてもパッケージというのは記述する際、実に面倒くさい代物です。ちょっとクラスを利用するのに、いちいちjavax.swing.JFrameと書かなければいけません。まだこれはいい方で、ライブラリなどによってはもっと長いパッケージ名を記述しなければならないものもあるのです。
となると、「もっと簡単にクラスを指定できないか?」と誰しも思うことでしょう。Javaでは「import」というキーワードを使い、あらかじめ使用するクラス名を指定することで、パッケージの指定を省略しクラス名だけでクラスを利用できるようになっています。
クラスの定義などの前に、
import クラスの指定;
というようにして記述します。例えば、javax.swing.JFrameをJFrameだけで使えるようにしたければ、次のように書きます。
import javax.swing.JFrame;
このようにimport文が記述されると、Javaはクラスを検索する際、importで指定されたクラスをクラス名だけで探し出すようになります。
また、ある程度の規模のプログラムになると、あるパッケージ内のクラスをまとめて利用することが多くなります。Swingを使ったプログラムなら、javax.swingパッケージ内の多数のクラスを利用することになるでしょう。そこで、このようなときには、
import javax.swing.*;
と記述することで「javax.swingパッケージにあるクラス全部」を指定できます。*はワイルドカードと呼ばれるもので、ここに任意のテキストが来ることを示します。「javax.swing.任意の文字」に当てはまるクラスすべてがimportされる、というわけです。
importを使って簡単な記述を!
では、import文を使って、先ほどのソースコードを書き直してみましょう。すると、次のような形になるはずです。
package codezine.java; import javax.swing.*; public class Sample { public static void main(String[] args) { JFrame frame = new JFrame("My Window"); frame.setSize(300,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
ずいぶんとすっきりしましたね。ソースコード内に「javax.swing.JFrame」という記述がなくなり、すべてJFrameだけで済むようになりました。
このimport文は、いくつでも用意できます。ワイルドカードを使い、よく使うパッケージ内のクラスをすべてimportしておけば、基本的にパッケージ名など気にせず、クラス名だけでソースコードが記述できるようになります。

