1/13 ファイル入出力,ネットワークプログラミング


前回までの補足


12/2の課題について


12/9の課題


質問と解答

Q.
ボタンをGUI部品として加えると,キーボードで「q」を押しても終了しなくなった.
A.
AWTのボタンはキーボード入力を奪い取る仕様になっているようです.GUI部品の組み合わせ(2)の,CanvasTestに
    // キー入力がbuttonに横取りされないようにするため
    deleteButton.addKeyListener(myCanvas);
    clearButton.addKeyListener(myCanvas);
とあるように,ボタンのKeyListenerを明示的にキーボードを受け取って欲しいクラスを指定する と直ります.
Q.
Kadai1202クラスから Mycanvasクラスの paintメソッドへ Textfield内の文字
列をどうやって渡したらいいかがわかりません。教えてください。
A.
TAの小田原です。

TextField tf = new TextField(5); とした時に、tf.getText(); というメソッ
ドによってtf上の文字列を得ることができます。イベントが生じたときに、
getText()を実行し、そこで得た文字列をpaint内で用いればよいでしょう。
 
Kadai1202クラスの変数を用いる場合には、その変数をクラス変数として、他
のクラスから参照できるようにしたうえで、その参照をMyCanvasクラスに渡さ
なければなりません。下では、MyFrameクラスのオブジェクトをMyCanvasクラ
スのコンストラクタに渡し、MyCanvasクラスのクラス変数に代入した上で、
paintからその変数を参照しています。

もっといい方法がありそうです。いろいろ考えてみて下さい。GUIにおけるク
ラス設計については、人に聞くだけでは限界があると思うので、正直なところ、
参考書を購入して独学することをお勧めします。わからないときはわかるとこ
ろまで戻って、時間をかけて復習しましょう。

import java.awt.*;
import java.awt.event.*;

public class MyFrame extends Frame{
    public TextField tf = new TextField(5);
    public MyFrame(String s){
	super(s);
    }
    public static void main(String[] args){
	MyFrame mf = new MyFrame("myframe");
	MyCanvas mc = new MyCanvas(mf);
	mf.tf.addActionListener(mc);
	mf.setLayout(new BorderLayout());
	mf.add(mf.tf, BorderLayout.SOUTH);
	mf.add(mc, BorderLayout.CENTER);
	mf.setSize(200, 200);
	mf.setVisible(true);
    }
}


class MyCanvas extends Canvas implements ActionListener{
    MyFrame mf;
    String str="";
    MyCanvas(MyFrame mf){
	this.mf = mf;
    }
    public void paint(Graphics g){
	g.drawString(str, 10, 10);
    }
    public void actionPerformed(ActionEvent e){
	str = mf.tf.getText();
	repaint();
    }
}

Q.
画像をファイルからロードしたいのですがアプレットのため今までのようなや
り方ではできなくなってしまいました。でも、initの内部に画像を読み出す部
分があるわけではないので授業でやった通りにもできません。どうしたらよい
でしょうか?

A.
計プロTAの矢野です。
アプレットで画像をロードする際には、
Appletクラスが持つメソッドgetImageが利用できます。

田中先生の授業ページ
http://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming03/1209-1.html
の一番下、注意事項の4番目に記述があります。
そこを引用させていただきますと、

> イメージの読み込みの際には,ファイルからのイメージのロードと描画で使った
> 「Toolkit.getDefaultToolkit().getImage(ファイル名)」というテクニックが
> 使えない.代わりに,AppletクラスのgetImageメソッドを使う. 
> 
> initの中で, 
> 
>    frame=new DrawImage();
>    frame.image=getImage(getCodeBase(),"test.gif");
> 
> のように使う. 

ということです。
メソッドの詳細については、APIを参照してください。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/applet/Applet.html

Q.
Kadai1209について聞きたいです
Kadai1209ディレクトリのしたにkadai1111.pngがあるが
class Draw extends Canvas ....{
 public Draw(){
 ....
  image=Toolkit.getDefaultToolkit().getImage("kadai1111.png");
 }
 public void paint(...){
  g.drawImage(image,0,0,this);
 }
}
public class Kadai1209 extends Applet...{ }
しかしindex.htmlで見ると、kadai1111.pngのimageを読み込めない。
("security exceptionpermision kadai1111")と現れる。そのため
chmod 755 kadai1111を実行したができなかった。
また、init() のなか、getImage(getCodeBase(),"kadai1111.png"))を使った。だが、読み込めない。だから、init()の中、drawImage(image,0,0,this)使ったつもりですが、エラが発生した
どうすればいいか、教えてください。
また 、Appletのサブクラス にsetmenubarを使いたいから
 class Kadai1209 extends Applet,Frame..{}のようにしたいが、できなかった。教えてください
ありがとうございます。

A.
  田中哲朗です.

  アプレット中ではセキュリティ上の制限により,上の手法は使えません,
http://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming03/1209-1.html 
でも説明して
います.

> また、init() のなか、getImage(getCodeBase(),"kadai1111.png"))を使った。だが、読み込めない。

  こちらの方法で正しいはずですが,「読み込めない」というのは具体的にどのようなエラーなのでしょうか?

> だから、init()の中、drawImage(image,0,0,this)使ったつもりですが、エラが発生した
> どうすればいいか、教えてください。

initの中では,描画をおこなうことができません.

> また 、Appletのサブクラス にsetmenubarを使いたいから
>  class Kadai1209 extends Applet,Frame..{}のようにしたいが、できなかった。教えてください

  アプレット本体にはメニューバーをつけることができないので,12/9の課題では
$B!V$J$k$Y$/F1$8F0:n$r$9$k!J%a%K%e!<%P!<$J$I$O:F8=$7$J$/$FNI$$!K!W$H>r7o$r
つけています.ただし,
http://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming03/1209-2.html 
のように,
WWWブラウザ以外のウィンドウを開くアプレットを作ると,そのウィンドウに
メニューバーをつけることは可能です.

Q.
Appletviewerで見たときはGUI部品はちゃんと動くのですが、提出用のHTMLファイルにするとどういうわけかGUI部品がまったく反応しなくなります。
どうしたらよいでしょうか?


A.
TAの小田原です。

どういうことなんでしょうね…。とりあえず、うちの環境(Linux,mozilla)で
コンパイルしてブラウザで見てみたところ、問題なく動いているように見えま
す。

マウスをクリックしたところに月が現れ、複数回クリックしたあとでその動き
をundo, redoできるというものですよね。また、clearを押すと月の位置が初
期状態に戻るんですね。

そういうわけで、とりあえず提出してみてはどうでしょうか。あと、ECCで動
かしているときは他のアプリケーションを落としてからブラウザだけ立ち上げ
て再トライしてみるというのはやってみる価値はあると思います。

最終課題について

1月25日(日) 21:00までに,好きな題材を選んで Java 言語でプログラムを作 成し,そのプログラムの説明をする HTML 文書を作成しなさい. 「~/java/Kadai1216/」というディレクトリを 作成し,HTML文書(index.html)とプログラムはすべて,その下に作成すること.

その上で, 最終回の1月27日(火)に,教卓上のNCを使って,発表(デモンストレーションと プログラムの説明)をしてもらい(提出人数によっては全員ではなくこちらの指 定した人だけになると思います),それで評価します.


次へ進む