Javaメモ

Javaの覚書

AppletをHTMLに埋め込む

ホームページにJavaAppletを貼り付ける場合、HTML4.01まではapplet要素が使えたのだが、5.0からはapplet要素はが廃止された。
HTML5.0では代わりにobject要素を使うそうだ。

objectタグを使う

‹object codetype = "application/java" codebase = "Base/" classid = "java:foo.class" width = 320 height = 240›

このようにするとフォルダ"Base"内のクラス"foo.class"を貼り付けられる。
ただしこのように貼り付けられるのはjava.Appletクラスの子クラスのみである。

以下のブラウザで動作することを確認

  • FireFox 3.6
  • Opera 11.0

以下のブラウザで動作しないことを確認

  • InternetExplorer 8.0
  • GoogleChrome 9.0

2011/ 2/12

appletタグを使う

‹applet code = "foo.class" WIDTH=640 HEIGHT=480›

このようにするとフォルダ"Base"内のクラス"foo.class"を貼り付けられる。codebaseを使えばフォルダの指定も出来る。
appletタグは正式でないものの、こちらの書き方に対応しているブラウザが多い。

以下のブラウザで動作することを確認

  • FireFox 3.6
  • InternetExplorer 8.0
  • GoogleChrome 9.0

Collection

反復処理中の変更

あるコレクションの反復処理中にそのコレクションを変更してはならない。
変更しようとした場合Iteratorは可能であればConcurrentModificationExceptionをスローする。

2011/ 1/ 2

String
String[] split(String str)

文字列を指定した区切り文字で区切ってくれる便利なやつ。
例えば、

String s = "abc,de,f";
String t[] = s.split(",");

とすると、tの中身は{"abc","de","f"}となる。

ただし、区切り文字に.(ドット)などを選ぶときは注意が必要。
.(ドット)は正規表現で改行を除く任意の一字を意味するため、.(ドット)で区切りたい場合はエスケープシーケンスと共に使う。
さらに、\(イェン)は"(ダブルクォーテーション)内では\\で表記するため、

String s[] = "test.txt".split("\\.");

のような書き方となる

2011/ 2/12

Component
void paint(Graphics g)

コンポーネントの描画命令。
オーバーライドしてそのコンポーネントの描画の方法を定める。

呼び出されるタイミング

repaint()後に呼び出されるほかに、一度(マウスカーソル以外で)隠された部分が再び表示される場合にも呼び出される。
このため、paint()内で呼ばれた回数をカウントをして描画内容を変えるようなことは避けるべきである。
また、再描画は隠されていた一部に対してのみ行われる。

下のように書くとスクロールしたときに縞が出たりする。

boolean b = true;

public void paint(Graphics g) {
 if(b) {
  g.setColor(Color.RED);
 } else {
  g.setColor(Color.BLUE);
 }
 g.fillRect(0,0,100,200);
 b = !b;
}

2011/ 3/ 4

MouseMotionListener
void MouseMoved(MouseMotionEvent e)

マウスが動いたときに呼ばれるメソッド。

マウスのボタンが降りているときには呼ばれないので注意。

2011/ 3/ 6

ArrayList
Object[] toArray()

ArrayList内の要素を配列として返す。

要素を特定の型にキャストしようとすると、ClassCastExceptionが発生する。
正しくは目的の型の配列を引数にとる<T>T[] toArray(T[])を使用する。
例を下に示す。

Aという型の配列arrayに、ArrayList listの中身を代入する場合

ArrayList list<A>;
A[] array;
 ・・・
 array = list.toArray(new A[list.size()]);
 ・・・

のように代入したい型の配列をリストのサイズでnewして引数にとってやればよい。

2011/ 9/14

多重ループからの脱出

二重forの中から一重目にcontinueしたり、一度に二つ以上のブロックから抜ける場合にはラベルをつかう。
ブロックの頭に (ラベル名): で名前をつけ、breakやcontinueなどの分岐命令でそのラベル名を指定することで使用する。

実は最近まで知らなかった。
以下はint[] arrayのなかから1,2,3の並びを探す例。

int[] array = {2,1,2,1,2,3,4,6,1,2,3};
int[] target = {1,2,3};
lab:for(int i = 0;i < array.length;i++) {
 for(int j = 0;j < target.length;j++) {
  if(i+j == array.length)
   break lab;
  if(array[i+j] != target[j])
   continue lab;
 }
 System.out.println(i);
}

検索が目的ならもっといいアルゴリズムがあるが、他の使い方がぱっと思いつかなかった。
二重ループからの脱出は何度も直面した課題なのだが... Googleで検索してもキーワードが悪いのか掛からず苦労した。

for文でなくラベルだけもブロックを作れる。

lab:{
・・・
break lab;
・・・
}

多用するとプログラムの流れがわかりにくくなるので注意。

2012/ 5/19

Boundsの座標変換

あるコンポーネントのBoundsを他のコンポーネントから見たものに変換するときはSwingUtilitiesのconvertRectangleメソッドを使う。

JConponent a,b,c をa.add(b) b.add(c)としたとき、aからみたcの座標を求めるには
rect = SwingUtilities.convertRectangle(b,c.getBounds(),a);

のようにする。

他にもSwingUtilitiesにはSwingのフレームワークを使う上で有用なメソッドが多くある。

2012/ 8/27