目次
[目次]
前回の復習:大事なことなのでもう一度やりましょう。
メモ帳(notepad.exe)を起動し下記の様にソースを書いて下さい
※何らかのプログラミング言語で書かれたテキストプログラムを一般的にソースコードと言います。Java言語でも同様です
メニューの「ファイル/名前を付けて保存」を選択し自分のフォルダ(Z:\gengo2)の中に名前「Hello.java」で保存して下さい。
※java言語ではソースファイルに1個しか公開(public)クラスを書けません。公開でないクラスは複数書けます。ここで、公開にしたクラスが在るときは、そのコードが書かれたソースファイルの名前と公開クラスの名前は同じにするのがルールになっています。
ファイル名の入力枠のすぐ下に「ファイルの種類」の欄が有りますが、ここは「すべてのファイル」に。「テキスト文書」にすると自動的に拡張子をtxtにされてしまいます。もし保存したファイル名がHello.java.txtになっている場合は、後でHello.javaに変更しましょう。
Java言語のコンパイラはソースコードを機械語ではなくて中間言語コードに翻訳します。この、中間言語コードはバイトコードと呼ばれています。
コマンドプロンプトを開いてソースコードのファイル「Hello.java」をコンパイルしバイトコードのファイル「Hello.class」を作ります。次の手順で行ってください。
※ソースコードをバイトコードにコンパイルするとき、他のソースファイルに有るクラスが必要になる場合があります。この時、必要なクラスがまだコンパイルされていない場合は、必要なクラスが記述されたソースファイルを見つけて、これを同時にコンパイルします。
C言語では複数のソースファイルに分割されたブログラムのコンパイルは個々のソースファイルごとにヘッダーファイルをインクルードしてコンパイルを行いました。しかし、java言語のコンパイラはヘッダーファイルを使わずに複数のソースファイルで構成されたプログラムを一括して処理します。
Hello.classを実行しましょう
javaがインタプリタ:Java仮想機械(JavaVM)のコマンドです。引数に指定するのはクラス名なので
コマンドプロンプト>java Hello
で実行してください。java
Hello.classではありません。実行が旨くいけば「HelloWorld!」が表示されます。
※C言語の静的リンクに相当する処理はjava言語では不要です。javaプログラムを実行するjavaVMが実行中に必要になれば、目的のclassファイルを探して取り込んでくれます。
[目次]2年生の演習でOpenGLの関数ライブラリーを使ってC言語でウインドウを開くプログラムを作ったことがあると思います。ここではjavaのクラスライブラリーを使ってウインドウを開きます。
ウインドウを作って、そのウインドウに対していろいろ指示していく流れのプログラムとなります。この方が解り易いのではないでしょうか?
java言語はオブジェクト指向言語なので、ウインドウの設計図となるクラス:java.awt.Frameからインスタンスとしてウインドウをいくつでも生成できます。それらはオブジェクトとして最低限の機能を初めから持っているのでマウス操作によるウインドウの移動や大きさの変更などを新たにプログラムする必要はありません。 勝手に動きます(別スレッドで動く)。
※OpenGLとGULTを使うCのプログラムではまずシステムを初期化し、ウインドを生成し、描画関数を登録する一連の関数を順番に呼び出し、最後にイベントループの関数を呼び出します。これに対してjavaのプログラムではFrameオブジェクトが動くために必要な初期化はFrameのインスタンス生成に際して全て自動的に行われます。描画関数を設定しなくても画面はクリアされますし、画面に表示されたFrameに対するイベントループも開始されます。
実際のプログラムは
public class FirstWindow0{ public static void main(String args[]){ java.awt.Frame window=new java.awt.Frame("初めてのWindow"); window.setSize(200,100); window.setVisible(true); } }
※パッケージ名まで覚えてほしいので、ここではimport文を使わず、わざとクラス名をパッケージ名まで含めたフルネームで書いています。
実行結果は
プログラムは上記の通りですから試してください。
注:ソースファイルの名前は必ずクラス名と同じFirstWindow0.javaで保存する必要があります。
※このプログラムは簡単にする為に、手抜きしています。ウインドウの大きさは変更できますがウインドウ右上角の×ボタンでは終了しません。このあたりはもっと後で説明します。ここではコマンドプロンプトの方を閉じることで終了してください。
下の図はクラス、インスタンス、変数の関係を図にしてみたものです。FirstWindow0クラスがメモリーに読み込まれ、赤い線で示すようにmainメソッドから実行が始まります。
※クラスやインスタンスの名前は四角の上段に書かれます。ここで,クラスとインスタンスを区別するために,インスタンスには元になるクラス名の前にコロンを付け,全体に下線を引きます。さらに,インスタンスに固有の名前を付けるときはコロンの前に書きます。
● mainメソッドの最初の行
java.awt.Frame window=new java.awt.Frame("初めてのWindow");
newでFrameのインスタンスを作り。インスタンスの初期化メソッドの引数でタイトルを「初めてのWindow」と初期化しています。newが戻すこのインスタンスの参照を変数windowに代入し記憶します。
※ここの処理に必要となるFrame クラスは自動的に読み込まれ初期化も行われます。 この他にもFrameが機能する環境を作る多数のクラスも読み込まれインスタンスも用意されます。説明を省きましたが、複雑な準備がしっかりと行われます。
※javaではインスタンス自体を記憶する変数は作れません。作れるのはインスタンスを参照するための値「参照:reference」を記憶する変数です。変数windowはC言語のポインター変数に似たものです。参照の話は次回行います。
java.awt.Frameはパッケージ名を含めたクラス名です
java.awtはパッケージ名で、そのパッケージ内のFrameクラスの意味になります。
● 続く2行
window.setSize(200,100); //windowの大きさを横200縦100ピクセル window.setVisible(true); //windowを見えるようにする
window変数の値を使ってインスタンスを参照し、ウインドウの大きさの設定メソッド,次にと表示設定メソッドを呼び出しています。インスタンスのメンバを参照する時は参照変数の後にドットを付け、続けてメンバ名を書きます。
※ここまでの3行をC++で書くなら
Frame *window=new Frame("初めてのWindow"); window->setSize(200,100); window->setVisible(true);
のようになります
※javaのプログラムではインスタンスのメソッドは、インスタンスの設計図であるクラス側に書かれています。プログラムの
window.setSize(200,100);
の部分では、windowがFrame インスタンスの参照なのでFrame
のsetSizeメソッドを呼び出しインスタンスの参照と赤い字で示した引数部分のデータを渡します。この方法で、クラス側に書かれたメソッドを複数のインスタンスから共用できます。
Frame.setSize(200,100);と書くのは間違いです。コンパイルエラーになります。この呼び方ではsetSizeをどのインスタンスに対して実行するのかが分かりません。Frame.setSize(window,200,100);のようにしてもいいのかもしれませんが、javaではwindow.setSize(200,100);と書く決まりです。この方がオブジェクト指向の考え方に合っています。
● この後はユーザーからの要求に勝手に反応します。例えば、ウインドウの大きさの変更などのウインドウ操作に対応して自動的な処理が行われます。
次に、ウインドウに文字を書いてみます。字や絵を直接描く方法もありますが、ここでは文字列の書かれたラベルをウインドウに貼る方法を紹介します。実行すると次のようになります。
プログラムは下記の通りですから試してください。。
注:ソースファイルの名前は必ずクラス名と同じFirstWindow.javaで保存する必要があります。
public class FirstWindow{ public static void main(String args[]){ java.awt.Frame window=new java.awt.Frame("初めてのWindow"); //Labelのインスタンスhelloを作る java.awt.Label hello=new java.awt.Label("Hello World!"); window.add("Center",hello); //windowの中央にhelloを貼る window.setSize(200,100); window.setVisible(true); } }
ウインドウに文字を描く代わりにラベルを貼りました。これはウインドウの再描画に対応するためです。再描画はウインドウの大きさや位置が変化したときに行われますが、再描画の手順を知らないと何処で描きなおしをプログラムすれば良いか分かりません。初めてのウインドウプログラムで、それは難しすぎます。
ここはオブジェクト指向プログラミングらしく再描画の手順を知らなくても可能な方法を選択しました。ラベルと呼ばれる文字列を表示する部品をウインドウに貼っておけば、再描画が必要な時に自動的に文字列を描きなおしてくれます。
1)java.awt.Labelは
ラベルオブジェクトの設計図となるクラスの名前です。
newでインスタンスを作るとき、初期化メソッドの引数 として渡した文字列がラベルに印刷される文字列となります。
2)helloはラベルのインスタンスを参照する変数です。
ここではnewで戻されたインスタンスの参照が代入されます。
3)Frameのaddメソッドは
ウインドウにラベルやボタンを貼り付けるメソッド(メンバ関数)です
addを使って、windowが指すウインドウにhelloが指すラベルを
貼り付けました。
下の図のようにwindow変数を使って、Frameインスタンスのaddメソッドを呼び出し、引数で張り付ける位置と、貼り付けるラベルを指示します。 addメソッドの実行結果としてFrameインスタンスとLabelインスタンスの間の関係が構築されます。
[目次]
上で紹介したウインドウはAWTと呼ばれるjavaが発表されたときから用意されていたGUIのクラスライブラリーを使っています。ここでは同様にして、ボタンを貼る例を次に示します。
実は、javaにはより高機能のGUIのクラスライブラリーSWINGやJavaFXがあります。こちらも気になるので同様のサンプルを作って違いを見ておきます。
※AWTは単純で,仕組みが見え易いので,AWTから始めます。SWINGやJavaFXは高機能ですが,そのぶん仕組みが複雑です。
AWTのウインドウをもう少し、いじってみましょう。まずはウインドウの上端にButtonを貼り付けてみましょう。実行結果はこんな感じです。
ウインドウの大きさを変えたらどうなる?。。。
いろいろ試してみよう。
ヒント1 Buttonクラスの名前はjava.awt.Buttonです
ヒント2 addで貼る位置は”Center”が中央、上下左右は”North”、”South”、”West”、”East”です
色んなオブジェクトを貼り付けることができます。余裕のある人は左右や下にも色々なオブジェクトを貼ってみてください。
オブジェクトは組み立てると勝手に連携して動くように作るのがオブジェクト指向プログラミングの要点。
まずはオブジェクト指向で作られた部品の面白さを感じてください。
そして....いずれは連動する部品を作れるようになってください。
※ javaの膨大なクラスライブラリーについてはjavaAPI(情報生体システム内のみ)を見てください。sunのページにも同じものが在ります。ここは外からも見えます。
SWINGと呼ばれるGUIのライブラリーを使うともっと高機能のGUIが使えます。AWT(Abstract Window Toolkit)を高機能化したライブラリーです。、AWTとは若干違っていますが基本は変わりません。AWTを説明していきますが、宿題などでSWINGにも挑戦することにします。
public class SwingWindow{ public static void main(String args[]){ //Frameを置き換えるためにSWINGライブラリに用意されたウインドウ JFrame を生成 javax.swing.JFrame window=new javax.swing.JFrame("SWINGを用いたWindow"); //右上の✖ボタンで、フレームを閉じるとき、同時にプログラムを終了する設定にする。(規定値は隠すだけ) window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); //ウインドウ内に部品を配置 Frame と異なり JFrame内部のcontentPaneに張り付ける java.awt.Container contentPane=window.getContentPane(); contentPane.add(new javax.swing.JTextArea("ここはJTextArea"), java.awt.BorderLayout.CENTER); contentPane.add(new javax.swing.JButton("これはJButton"), java.awt.BorderLayout.SOUTH); //awtの部品(TextAreaやButton)とswingの部品を混ぜて使うことはできないので注意 //そのためにわざわざJ何とかといったクラスが用意されている //大きさを指定して表示 window.setSize(300,300); window.setVisible(true); } }
下の画面はWindows7で実行したときに表示されたウインドウです。
Java8からはJavaFXと呼ばれるGUIの新しいライブラリーが使えます。このライブラリーはXMLで記述したTEXTファイルを読んでGUIのアプリケーションを生成することができるのが特徴です。次の例は,上記と比較するためにこの機能は使っていません。
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TextArea; import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class JavaFXTest1 extends Application { public static void main(String args[]) { launch(args); } public void start(Stage stage) throws Exception { TextArea text = new TextArea("ここはjavafx.scene.control.TextArea"); Button button=new Button("ここはjavafx.scene.control.Button"); // BorderPane pane = new BorderPane(); pane.setCenter(text); pane.setBottom(button); Scene scene = new Scene(pane, 300, 100);//シーンで大きさを指定 // stage.setTitle("JavaFXのApplication");//ステージでタイトルを指定 stage.setScene(scene);//ステージのシーンをセット stage.show();//ステージを表示 } }
下の画面は,上記を実行したときに表示されたウインドウです。TextAreaとかButtonとかのAWTのクラスと同じ名前がありますが,これらはAWTのjava.awt.Buttonとは異なるjavafx.scene.control.Buttonです。AWTやSWINGとは完全に独立したGUIのライブラリです。
[目次]課題1が未提出の人は1を先に出してください。
実行結果はこんな感じです。
123456789 水野和生
ヒント System.out.println() の printlnは文字列を書いた後で改行します。
ちなみにSystem.out.print()では文字列を描きだした後の改行はしません。
レポートツールでレポートを提出する手順を確認してください。
※課題以外はレポートツールを使う必要はありません。コマンドラインで実行する方が勉強になります。
これはひたすら写経する課題です。javaプログラムがどんな感じなのかを体得してもらうのが目的です。
まだ意味の解らないことが書かれていると思いますが我慢して打ち込んでください。コメントは打つ必要無し。省いてください。
※字下げは重要なので必ず行うこと。(行の書き出し位置は手本のように下げること)
IEで見ると手本の字下げが正しく表示されないことがあります。Firefoxで見てください。
※”\n” は ”\n”に読み替えてください。
/*P2.java*/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; public class P2 { public static void main(String args[]) { JFrame window=new EditorFrame(); window.setSize(600,300); window.setVisible(true); } } class EditorFrame extends JFrame { JTextArea textarea=null; public EditorFrame() { super("SWINGを用いたテキストエディタ1 ファイルを開くことしかできない"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //テキストを編集するために部品JTextAreaは画面中央に付ける Container contentPane=getContentPane(); textarea=new JTextArea("ここはJTextArea"); //スクロール機能を追加してJFrameに貼る JScrollPane scroll=new JScrollPane(textarea);; scroll.getViewport().setScrollMode( JViewport.SIMPLE_SCROLL_MODE); contentPane.add(scroll,BorderLayout.CENTER); //ファイルを開くためのメニューを用意付ける //まずウインドウの上部にメニューバーを付ける JMenuBar menubar=new JMenuBar(); setJMenuBar(menubar); //メニューバーに基本メニューを付ける JMenu basicMenu=new JMenu("B:基本"); basicMenu.setMnemonic('B');//Alt+Bキーでメニューが開ける menubar.add(basicMenu); //基本メニューにファイルのload項目を付ける basicMenu.add(new LoadItem()); } //ファイルダイヤログを開き選択されたファイルからテキストをテキストエリアに読み込む void load() { //ファイルメニューを開いてファイルを選択 JFileChooser chooser = new JFileChooser(); synchronized(chooser){ int ret=chooser.showOpenDialog(this); if(ret!= JFileChooser.APPROVE_OPTION) return; } //ファイルの中身をtextareaにコピーする textarea.setText(getText(chooser.getSelectedFile())); } String getText(File file) { //文字コード変換を行いファイルからテキストを読みバッファに格納 StringBuffer buffer=new StringBuffer(); try{ BufferedReader input= new BufferedReader( new InputStreamReader(new FileInputStream(file),"JISAutoDetect") ); while(input.ready()){ buffer.append(input.readLine()); buffer.append("\n"); } input.close(); }catch(Exception ex){ ex.printStackTrace(); buffer.append("\nファイルの読込みで例外"+ex+"が発生しました\n"); } return buffer.toString();//バッファの中身を纏めて文字列に転換し戻す } //load関数を呼び出すメニュー項目を内部クラスで用意 class LoadItem extends JMenuItem implements ActionListener { LoadItem() { super("L:Load",'L'); addActionListener(this); } public void actionPerformed(ActionEvent ae) { load(); } } }
実行するとwindowが開く。基本のメニューからL:Loadの項目を選ぶと
ファイル読み込みのダイアログが下のように開くので。ここでテキスト形式のファイルを選択。ここでは今作ったP2.javaを選びました。
開くボタンでファイルを開いて中身をウィンドウのテキストエリアに表示します。
ウインドウ右上の×ボタンでウインドウが閉じて終了。
※レポートを送信するときも同様に操作してください。
ごく短いプログラムですが、テキストエリアは文字の編集機能を持っているので、保存の機能を追加すれば最低限のテキストエディタとして使えます。
[目次]