記事一覧 ソースコードについて 50: 逆ポーランド記法の計算 //------------------------------------------- //RevPolish.java import java.util.*; //StringTokenizer class Stack { int[] data; int sp, err; Stack(int n) { data = new int[n]; sp = err = 0; } void err(){System.out.println("?");} void push(String s){ if(sp >= data.length){err = 1; return;} data[sp] = Integer.parseInt(s); sp++; } void push(int i){ if(sp >= data.length){err = 1; return;} data[sp] = i; sp++; } int pop(){ if(sp <=0){err = 1; return 0;} sp--; return data[sp]; } } public class RevPolish { public String s; String[] x = new String[30]; int n; Stack stk = new Stack(10); public RevPolish(){} public void calc(String s0){ StringTokenizer t; int i, j, k; char c; t = new StringTokenizer(s0, " "); n = t.countTokens(); for(i = 0; i < n; i++){ x[i] = t.nextToken(); } for(i = 0; i < n; i++){ c = x[i].charAt(0); if('0' <= c && c <= '9'){ stk.push(x[i]); }else{ k = stk.pop(); j = stk.pop(); switch(c){ case '+': j += k; break; case '-': j -= k; break; case '*': j *= k; break; case '/': j /= k; break; } stk.push(j); } } if(stk.sp != 1) stk.err = 1; if(stk.err == 1) s ="?"; else s = String.valueOf(stk.data[0]); } } //------------------------------------------- |
逆ポーランド記法の計算を行うプログラム P20 を少し 修正して左記の RevPolish クラスを定義し,アプレッ トに使用する例を以下に示します. (1) JApplet クラスを継承した Calc クラスを作ります. (2) Calc.java のフォームに jTextField1,jButton1 を作ります. (3) jButton1MouseClicked(Event evt) を次のように オーバーライドします. private void jButton1MouseClicked( java.awt.event.MouseEvent evt) { RevPolish p = new RevPolish(); String s = jTextField1.getText(); p.calc(s); jTextField1.setText(s + " = " + p.s); } (4) jTextField1,jButton1 のプロパティ(サイズ, 初期値等)を適当に設定します.例えば (5) HTML ファイルに次の行を挿入します. <applet height=150 width=250 code="Calc.class"> </applet> NetBeans の場合,Shift+F11 で作成した Calc.html を実行すると,jButton1 のクリックで jTextField1 .text が 12 34 + 10 * = 460 と変わります.jTextField のインスタンスはここを クリックすればキー入力できるので,表示内容を変更 して jButton1 をクリックすると変更後の式の値が 表示されます.式にエラーがあれば行末は "=?" と なるはずです. P20 で述べたように計算は整数の四則演算に限定して います(-3 は 0 3 - とする).機能の拡張は各自試 みてください. [5-9] StringTokenizer (Java 2 Platform SE 5.0) http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/StringTokenizer.html StringTokenizer クラスを使用すると、アプリケー ションで文字列をトークンに分割できます。 [5-10] Math (Java Platform SE 6) http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Math.html |
記事一覧 ソースコードについて 5.4 アクションリスナ 「5.2」の jButton1MouseClicked や「5.3」の jTextField1MouseEntered のようなイベントは MouseListener インターフェイスを実装した MouseAdapter クラスのメソッドで処理されます.
以下の説明・参考資料は興味のある人だけ流し読みしてください. Hello.java のソースの関連部分は private void initComponents() { jTextField1 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jTextField1.setText("jTextField1"); jTextField1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseEntered(java.awt.event.MouseEvent evt) { jTextField1MouseEntered(evt); } }); jButton1.setText("jButton1"); jButton1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButton1MouseClicked(evt); } }); //********************** } private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: jTextField1.setText("Hello,world"); } private void jTextField1MouseEntered(java.awt.event.MouseEvent evt) { // TODO add your handling code here: jTextField1.setText(" "); } となっていて,JButton クラスのインスタンス jButton1 に対する MouseListener インター フェイスのメソッド mouseClicked(evt) が上記の addMouseListener(MouseListener l) の引 数部分の定義でオーバイライドされていることが分かります.jTextField1 の mouseEntered (evt) についても同様です. [5-6] リスナー - とほほのWWW入門 http://www.tohoho-web.com/java/listener.htm リスナー とは、ボタンをクリックした、メニューを実行した、ウィンドウをリサイズした、 マウスを動かした、キーを押したなどのイベント監視し、イベント発生時に対応するアクシ ョンを実行するオブジェクトです。主なリスナーには次のようなものがあります。 [5-7] 4.2 イベントとリスナ http://web.hc.keio.ac.jp/~fujimura/lang/page-4-2.html 通常は下記のように(別の場所で)クラスを定義し、そのコンストラクタに対して new を指定 するのですが、名前をつけずにコンストラクタを直接書き込んでしまう記述方法です。 class MyActionListener implements ActionListener { MyActionListener() { public void actionPerformed(ActionEvent e) { pane.setBackground( Color.BLUE ) ; } } } [5-8] ActionListener (Java 2 Platform SE 5.0) http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/event/ActionListener.html アクションイベントを受け取るためのリスナーインタフェースです。アクションイベントの 処理に関連するクラスは、このインタフェースを実装します。さらに、そうしたクラスによ って作成されたオブジェクトは、コンポーネントの addActionListener メソッドを使用する ことによってコンポーネントに登録されます。アクションイベントが発生すると、オブジェ クトの actionPerformed メソッドが呼び出されます。
記事一覧 ソースコードについて 5.3 コンポーネントのプロパティ 「5.1」のプログラムのフォームには多くのコンポーネントが含まれていますが,とりあえず自分で作った jTextField1 と jButton1 について眺めてみましょう. jButton1 をクリックすると jTextField1.text が "Hello, world." に変わりますが,文字列の先頭が欠け ています.jTextField1 のサイズを変更するには (1) Chk2View.java のデザイン画面で jTextField1 のハンドルをドラッグして水平方向のサイズを大きくします. デザイン変更後,jTextField1 の右クリックでプロパティを表示すると となって,レイアウト の 水平サイズ が「デフォルト」から「252」に変わっています (キー入力で変更可能). Hello.java のコードも initComponents() 内の水平方向のレイアウトの処理が layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(190, Short.MAX_VALUE) .addComponent(jButton1) .addGap(135, 135, 135)) .addGroup(layout.createSequentialGroup() .addGap(46, 46, 46) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(102, Short.MAX_VALUE)) ); となっていて,jButton1 に比べて jTextField1 の方が addComponent() の引数が増えていることが分かります. 2010-10-15 の「イベント駆動」でも述べたようにイベントもプロパティです. 参考までに「5.1」で述べた jButton1 の「イベント」の一部を次に示します. また,jTextField1 の「イベント」を見ると mouseEntered があるので,イベントハンドラ (2) private void jTextField1MouseEntered(java.awt.event.MouseEvent evt) { // TODO add your handling code here: jTextField1.setText(" "); } を作ると,マウスが jTextField1 内に入ると文字列が消えて,jButton1 をクリックすると "Hello, world." を表示するということの繰返しができるようになります. [5-3] ソフトウェアコンポーネント - Wikipedia http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88 [5-4] コンポーネントによるプログラミング http://msdn.microsoft.com/ja-jp/library/0ffkdtkf(v=vs.80).aspx [5-5] NetBeans IDE での Swing GUI のデザイン - チュートリアル http://netbeans.org/kb/docs/java/quickstart-gui_ja.html JTextField のサイズを変更する手順は、次のとおりです。・・・ コンポーネントの位置揃えを行うには、次の手順に従います。・・・
記事一覧 ソースコードについて 5.2 Applet クラスの継承 「5.1」の Chk2App.java の代わりにブラウザが Chk2View.java の関数を使うようにしたのが Java の アプレットで,Applet クラスを継承する形でプログラムを作ります.例えば [5-3] に示されている import java.applet.Applet; import java.awt.Graphics; public class DefaultApplet extends Applet { public void paint(Graphics g) { g.drawString("test!", 16, 16); } } という簡単な継承でも,ブラウザ上に "test!" と表示できます. 「5.1」のようなフォームのアプレットを作るには (1) ファイル(F) > 新規プロジェクト(W) (2) カテゴリ(C):Java > プロジェクト(P):Java クラスライブラリ > 次へ(N) (3) プロジェクト名(N):lib2 > 完了(F) (4) lib2 ソースパッケージ > 新規 > JApplet フォーム > クラス名(N):Hello > 完了(F) (5) Hello.java のフォームに jTextField1,jButton1 をドラッグ. (6) Hello.java のコードに jButton1MouseClicked のイベントハンドラを追加. (7) lib2 ソースパッケージ > 新規 > HTML ファイル > ファイル名(N):hello (8) Hello.html の「TODO write content」を次行で置換 (不等号は半角にしてください). <applet height=500 width=500 code="Hello.class"></applet> (9) 実行(R) > プロジェクト(lib2)を削除して構築(C) とすれば,lib2\build\classes のフォルダに Hello.class,hello.html が作られます. NetBeans を終了して hello.html ファイルをクリックするとブラウザに のようなフォームが表示されます. [5-3] Javaアプレットメモ(Hishidama's JavaApplet Memo) http://www.ne.jp/asahi/hishidama/home/tech/java/applet.html [5-4] 第15章 アプレット http://web.hc.keio.ac.jp/~fujimura/lang/lec-n12.html [5-5] アプレット http://wisdom.sakura.ne.jp/system/java/swing/swing2.html Swing に AWT のコンポーネントを使うことは好ましくありません [5-6] Web アプリケーションでのアプレットの統合 - NetBeans http://netbeans.org/kb/docs/web/applets_ja.html
記事一覧 ソースコードについて 5.アプレット 5.1 GUI アプリケーション NetBeans で GUI アプリケーションをつくるには (1) ファイル(F)>新規プロジェクト(W) (2) カテゴリ(C):Java > プロジェクト(P):Javaデスクトップアプリケーション > 次へ(N) (3) プロジェクト名(N):chk2 > 完了(F) で新しいプロジェクト chk2 を作ります.(L)(D)(C)(A)(U)(E)(M)は規定値のままにしておきます. プロジェクト chk2 のソースパッケージには Chk2AboutBox.java,Chk2App.java,Chk2View.java が 出来ています. Chk2App.java のコメントを除いた部分は次のようになっています(左端の数字は行番号). : //Chk2App.java 005 : package chk2; 007 : import org.jdesktop.application.Application; 008 : import org.jdesktop.application.SingleFrameApplication; 013 : public class Chk2App extends SingleFrameApplication { 018 : @Override protected void startup() { 019 : show(new Chk2View(this)); 020 : } 027 : @Override protected void configureWindow(java.awt.Window root) { 028 : } 034 : public static Chk2App getApplication() { 035 : return Application.getInstance(Chk2App.class); 036 : } 041 : public static void main(String[] args) { 042 : launch(Chk2App.class, args); 043 : } 044 : } Chk2View.java はデザイン画面とソースの表示を切り替えることができます. デザイン画面の表示では予め作られている次のフォームが表示されます. 上: menuBar[JMenBar] -- ファイル(fileMenu[JMenu]), ヘルプ(helpMenu[JMenu])作成済み. 中: mainPanel[JPanel] 下: statusPanel[JPanel] -- 進捗バー作成済み このフォームを のように変えて,jButton1 をクリックすると jTextField1 に "Hello, world." と表示させるために次の ことを行います. (4) パレットから Swing コントロールのテキストフィールド(jTextField1)をマウスでドラッグして mainPanel にもってきます. (5) 同様に Swing コントロールのボタン(jButton1)も mainPanel にもってきます. (6) jButton1 を右クリックしてプロパティを表示させ,メニューの「イベント」をクリックします. (7) イベントの mouseClicked のイベントハンドラ を<なし>から jButton1MouseClicked に変更します. (8) Chk2View.java のコード表示で,// TODO add your handling code here: の下に次の行を挿入します. jTextField1.setText("Hello,world"); jTextField1.text に書き込むメソッドは,ソースコードに「jTextField1.」を追加して待っていると次に 入力する候補が表示され,その中に setText(String t) が含まれています.結局,ソースプログラムでの キー入力による変更部分は下記の※の行の挿入だけです. : //Chk2View.java 005 : package chk2; --- : //****************** 022 : public class Chk2View extends FrameView { --- : //****************** 101 : private void initComponents() { --- : //****************** 207 : } 217 : private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { 218 : // TODO add your handling code here: 219 ※ : jTextField1.setText("Hello,world"); 220 : } 222 : // Variables declaration - do not modify --- : //****************** 240 : } プログラムの実行は (9) 実行(R) > 主プロジェクトを実行(R) です.これによって表示されるフォームの jButton1 をクリックすると jTextField1 に "Hello, world." が表示されます.NetBeans の IDE なしで実行するファイルを作るには (10) 実行(R) > 主プロジェクトを削除して構築(C) を行うと,chk2\dist フォルダに chk2.jar ファイル (これをクリックすればいつでも実行) ができます. [5-1] NetBeansUserFAQJa - NetBeans Wiki http://wiki.netbeans.org/NetBeansUserFAQJa [5-2] 開発者にやさしいIDE, NetBeansを使ってみよう! http://otn.oracle.co.jp/technology/global/jp/sdn/java/series/netbeans/private/200604.html