|
|
・メソッド間の文字列の受け渡し1
JAVAにはC言語のようなポインタがありません。代わりにjava.lang.StringBufferクラスを用います。StringBufferクラスは、文字列を保持しています。
例:
public class test
{
public static void main(String args[])
{
StringBuffer s = new StringBuffer("abc");
System.out.println(s);
test_method(s);
System.out.println(s);
}
public static void test_method(StringBuffer s)
{
}
}
出力結果:
abc
abcdef
・メソッド間の文字列の受け渡し2
StringBufferは文字列を全て削除するメソッドがありません。別の方法として新しいクラスを作成して文字列を受け渡す方法を紹介します。
例:
public class test
{
public static void main(String args[])
{
Args s = new Args();
s.a = "abc";
System.out.println(s.a);
test_method(s);
System.out.println(s.a);
}
public static void test_method(Args s)
{
}
}
class Args
{
}
出力結果:
abc
def
・作成したクラスの配列を使用する
作成したクラスの配列は全てnewで初期化しなければなりません。
例:
public class test
{
public static void main(String args[])
{
Args s[] = new Args[10];
for (int i = 0;i < 10;i++)
s[0].a = "11";
System.out.println(s[0].a);
}
}
class Args
{
}
出力結果:
11
・文字列をint型、long型に変換
基本ですが、分からない方は苦労されると思うので一応。IntegerクラスやLongクラスのparseInt、parseLongを用います。byte型、short型なども同様にByte.parseByte、Short.parseShortというメソッドがあります。
例:
public class test
{
public static void main(String args[])
{
String s = new String("1");
long l;
l = Long.parseLong(s);
System.out.println(l);
}
}
出力結果:
1
・staticについて
クラスをいくつ生成してもstaticで宣言された変数は一つの値しか持ちません。
例:
public class test
{
public static void main(String args[])
{
Args a[] = new Args[10];
for (int i = 0;i < 10;i++)
a[0].s = "1";
a[1].s = "2";
System.out.println(a[0].s);
}
}
class Args
{
}
出力結果:
2
ただし、これには問題があります。アプレットの変数にstaticを使ったとき、別のページでも同じアプレットが存在すると、そのstatic変数が共有されてしまいます。
・ファイルに追加書き込みをする(1)
ファイル出力時に、以前のファイルの内容を消さずに、新しいデータを追加書き込みするには、以下のようにすればできます。
例:
import java.io.*;
public class test
{
public static void main(String args[])
{
try
{
FileOutputStream out = new FileOutputStream("test.txt",true);
String str = "TEST\n";
out.write(str.getBytes());
}
catch(Exception e){}
}
}
このFileOutputStreamクラスのコンストラクタには、FileOutputStream(String name,boolean append)があって、appendをtrueにすれば、追加書き込みモードで開きます。
・ファイルに追加書き込みをする(2)
ファイル追加書き込みをする、別の方法として、java.io.RandomAccessFileクラスを使う方法があります。
例:
import java.io.*;
public class test
{
public static void main(String args[])
{
File file = new File("test.txt");
try
{
RandomAccessFile ra = new RandomAccessFile(file,"rw");
int size = (int)ra.length();
ra.skipBytes(size);
ra.writeBytes("TEST\n");
ra.close();
}
catch(Exception e){}
}
}
RandomAccessFile.skipBytes(int)を使えば、ファイルの途中から書きこむということもできそうです。
・アプレットでサーバにあるファイルをオープンする
アプレットがサーバまたはローカル(アプレットがローカルにある場合)に置いてあるテキストファイルなどをオープンすることはできます。下の例ではアプレットと同じ場所に置いてあるテキストファイルを開いて、文字列を全てjava.lang.Stringクラスに格納しています。
例:
import java.applet.*;
import java.net.*;
import java.io.*;
public class applet1 extends Applet
{
public void init()
{
try
{
URL dataURL = new URL(getDocumentBase(),"test.txt");
DataInputStream di = new DataInputStream(dataURL.openStream());
String fileBuf = new String("");
String lineBuf = new String("");
while (lineBuf != null)
{
fileBuf += lineBuf;
lineBuf = di.readLine();
}
di.close();
}
catch(Exception e){}
}
}
ただ、アプレットはセキュリティを良くしているために、ファイルの保存など、サーバやローカルに勝手にファイルを置くことは、CGIなどを使わないかぎりできません。
・アプレット間通信
アプレット間でデータをやり取りするには、下のようにします。
例:
(index.html)
<html>
<body>
<applet code=applet1.class name=applet1 width=200 height=50>
</applet>
<applet code=applet2.class name=applet2 width=200 height=50>
</applet>
</body>
</html>
(applet1.java)
import java.applet.Applet;
import java.awt.*;
public class applet1 extends Applet
{
public void init()
{
add(new TextField("Hello Java"));
}
public boolean action(Event e,Object o)
{
Class2 c2 = (Class2)getAppletContext().getApplet("applet2");
c2.set((String)o);
return true;
}
}
(applet2.java)
import java.applet.Applet;
import java.awt.*;
public class applet2 extends Applet
{
String msg = "";
public void set(String s)
{
}
public void paint(Graphics g)
{
}
}
・JAVASCRIPTからJAVAアプレットのメソッドを呼ぶ
JAVAアプレットのpublicメソッドをJAVASCRIPTが呼ぶことができます。<form>やfunctionの中でdocument.(アプレットの名前).(アプレットのメソッド)と書けば呼ぶことができます。
例:
(index.html)
<html>
<body onLoad="AppletTest()">
<applet code=applet1.class name=appletid width=300 height=200>
</applet>
<script language="JAVAScript">
<!--
function AppletTest()
{
document.appletid.AppletMethod("THIS IS A TEST.");
}
//-->
</script>
</body>
</html>
(applet1.java)
import java.applet.*;
public class applet1 extends Applet
{
public void AppletMethod(String str)
{
}
}
・JAVAアプレットからJAVASCRIPTの関数を呼ぶ
netscape.javascript.JSObjectクラスを用います。JAVASCRIPTの関数を使うときは、HTMLの<applet>タグのところにMAYSCRIPTと書いてください。下の例は、ダイアログを表示するJAVASCRIPTの関数を、アプレットが呼んでいます。ちなみにInternet Explorerでも問題ありませんが、コンパイルするときは、Netscapeがインストールされていて、NetscapeフォルダのJAVAのクラスにクラスパスが通っていなければなりません。
例:
(applet1.java)
import java.awt.*;
import java.applet.*;
import netscape.javascript.*;
public class applet1 extends Applet
{
public void init()
{
try
{
JSObject jsobj = JSObject.getWindow(this);
jsobj.eval("box()");
}
catch(Exception e){}
}
}
(index.html)
<html>
<body>
<applet code=applet1.class height=100 width=100 MAYSCRIPT>
</applet>
<script language="JavaScript">
<!--
function box()
{
alert("JAVA APPLET IS RUNNING");
}
//-->
</script>
</body>
</html>
・JAVAアプレットからJAVASCRIPTに引数を渡す
アプレットがJAVASCRIPTの関数を呼ぶときに、引数をSCRIPTに渡すには、java.lang.Objectの配列を用意してやらなければなりません。
例:
(applet1.java)
import java.awt.*;
import java.applet.*;
import netscape.javascript.*;
public class applet1 extends Applet
{
public void init()
{
try
{
JSObject jsobj = JSObject.getWindow(this);
Object array[] = new Object[1];
array[0] = "FROM JAVA APPLET";
jsobj.call("box",array);
}
catch(Exception e){}
}
}
(index.html)
<html>
<body>
<applet code=applet1.class height=100 width=100 MAYSCRIPT>
</applet>
<script language="JavaScript">
<!--
function box(msg)
{
}
//-->
</script>
</body>
</html>
・アプレットの署名について
ActiveXをコントロールするクラスを使うアプレットは、署名をしなければなりません。Visual
J++ 6.0でCABファイルに署名をするには、プロジェクトのプロパティを開き、出力フォーマットのパッケージ化を有効にし、CABファイルの設定をしてからビルドをします。
アプレットとCABファイルを配布するには、<APPLET>のパラメータに
<PARAM NAME=cabbase VALUE="・・・.CAB">
という感じで指定します。
・アプレットの置いてあるサーバの場所を取得する
アプレットの置いてあるサーバまたはローカルのパスを取得するには、Applet.getDocumentBase()でアプレットのあるHTMLファイルのURL(例 : file:/C:/test/index.html)、Applet.getCodeBase()でアプレットのあるフォルダのURLを取得できます。(例 : file:/C:/test/)
・フレームがWindowsの閉じるボタンのイベントを得る1
JAVAで作成したフレームをWindowsで表示したとき、閉じるボタンを押しても何も反応しません。閉じるボタンを有効にするには、下のような感じで書きます。
例:
public class test extends Frame
{
public boolean handleEvent(Event e)
{
if (e.id == Event.WINDOW_DESTROY)
{
this.dispose();
return true;
}
return super.handleEvent(e);
}
}
・フレームがWindowsの閉じるボタンのイベントを得る2
閉じるボタンを有効にする別の方法を紹介します。
例:
import java.awt.*;
import java.awt.event.*;
public class test extends Frame
{
public test()
{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
}
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING)
dispose();
}
}
・フレームがWindowsの閉じるボタンのイベントを得る3
閉じるボタンを有効にする別の方法を紹介します。
例:
import java.awt.*;
import java.awt.event.*;
public class test extends Frame
{
public void init()
{
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
}
});
}
}
・フレームを指定してHTMLを表示する
java.applet.AppletContextクラスのshowDocumentを用います。
HTML側は、下のような感じだったとします。
<html>
<body>
<frame set cols="390,*">
<frame src="frame1.html" name="frame1">
<frame src="frame2-1.html" name="frame2">
</frame set>
</body>
<html>
frame1.htmlにアプレットが貼り付けてある場合、frame2を別のページに切り替えるには、次のようにします。
例:
import java.applet.*;
import java.net.*;
public class applet1 extends Applet
{
static AppletContext appletcontext;
public applet1()
{
appletcontext = getAppletContext();
try
{
URL url = new URL(getDocumentBase(),"frame2-2.html");
appletcontext.showDocument(url,"frame2");
}
catch(MalformedURLException e){}
}
}
なお、showDocumentで指定したフレーム名が存在しない場合は、新しいウィンドウが開いてページを表示します。
・アプレットでスライダーバーを使う
JAVAアプレットはGUIが豊富でないので、スライダーバーなんかも当然ありません。じゃあ、スライダーバーを貼り付けたい場合はどうするのかと言うと、JDKのswingクラスなんかを使う手もありますが、ここではVisual J++ 6.0のcom.ms.ui.UISliderクラスを使って表示する方法を紹介します。
UISliderは普通のアプレットには貼り付けることができません。この場合、com.ms.ui.UIAppletをベースにします。それから、アプレットがUIAppletの場合、Internet
Explorerでしか見れなくなるので注意してください。
例:
import com.ms.ui.*;
public class SliderApplet extends UIApplet
{
static UISlider slider;
public void init()
{
slider = new UISlider(UISlider.TICKSBELOW | UISlider.POINTSBELOW,0,95,5,1,0,5);
setLayout(new UIFlowLayout());
add(slider);
}
}
メソッドなどの詳細はMicrosoft Developer Network(MSDN)を参照してください(英語ですが・・・)。
・スライダーバーのイベントを取得する
上で紹介したUISliderのイベントを取得するには、com.ms.ui.event.IUIMouseListenerをインプリメントするとできます。
例:
import com.ms.ui.*;
import com.ms.ui.event.*;
public class SliderApplet extends UIApplet implements IUIMouseListener
{
public void init()
{
UISlider slider = new UISlider(UISlider.TICKSBELOW | UISlider.POINTSBELOW,0,95,5,1,0,5);
setLayout(new UIFlowLayout());
add(slider);
slider.addMouseListener(this);
}
public void mousePressed(UIMouseEvent e)
{
}
public void mouseReleased(UIMouseEvent e)
{
}
public void mouseEntered(UIMouseEvent e)
{
//マウスカーソルがスライダーバーに入ったときの処理を記述
}
public void mouseExited(UIMouseEvent e)
{
//マウスカーソルがスライダーバーから離れたときの処理を記述
}
public void mouseClicked(UIMouseEvent e)
{
}
}
・UIFrame、UIAppletのグラフィックを更新する
通常のアプレットではrepaintで再描画ですが、上で紹介したUIAppletやUIFrameでは使えないため、com.ms.ui.UIComponent.printAllというメソッドを使います。
例:
this.printAll(getGraphics());
・UIAppletがJavaScriptの関数を呼ぶには?
UIAppletをextendsしたアプレットでは、JSObject.getWindow(Applet applet)の部分でgetApplet()してもnullが返ってきてしまい、うまくいかないです。これを解決するには、com.ms.ui.AwtUIAppletクラスを用いてこれをベースにしたアプレットにします。
例:
import com.ms.ui.*;
import netscape.javascript.*;
public class Class1 extends AwtUIApplet
{
}
class UIClass1 extends UIApplet
{
//こちらにアプレット本体の処理を記述します。
public void init()
{
try
{
JSObject win = JSObject.getWindow(getApplet());
win.eval("alert( \" TEST \" )");
}
catch(Exception e){}
}
}
・配列のリサイズ
JAVAでは、一度配列の大きさを決めてしまうと、配列のサイズを変更することはできません。しかし、最初にあらかじめ大きな配列を用意してしまうと、無駄なメモリを使用してしまいます。これを解決するには、java.util.Vectorクラスを用います。Vectorクラスには、addElement、elementAtなどのメソッドが用意されており、addElementでVectorクラスのオブジェクトを格納し、自動的に必要なメモリを確保してくれます。オブジェクトを取り出すには、elementAtを使用します。
例:
import java.util.*;
public class test
{
public static void main(String args[])
{
int a;
String str = new String();
Vector vec = new Vector();
for (a = 0;a < 10;a++)
{
str = Integer.toString(a);
vec.addElement(str);
}
for (a = 0;a < 10;a++)
{
str = (String)vec.elementAt(a);
System.out.println(str);
}
}
}
・配列のサイズの取得
オブジェクト.length()で取得できます。(VBのUBound()と同等)
・スレッドのコントロール
スレッドの一時停止はsuspend()で行い、再開はresume()です。一度stop()で止めてしまったら、start()しても再開はできません。
また、スレッドの安全性を考えると、Thread.stop()は用いずにループを抜けさせるようにした方がいいみたいです。
例:
class testThread extends Thread
{
boolean endFlag = false;
public void run()
{
while (!endFlag)
{
try
{
}
catch(InterruptedException e){}
//処理を記述
}
this.stop();
}
}
・jarやzipなどの圧縮ファイルを作成する
jarやzipなどの圧縮ファイルを作成するには、MS-DOSプロンプトで、
jar cvf (ファイル名).jar *.class
jar cvf (ファイル名).zip *.class *.gif
という感じにすればできます。
アプレットでこれらの圧縮ファイルからクラスファイルを読み込ませるには、下のようにします。
<applet code=test.class archive=test.zip width=100 height=50>
</applet>
・アプレットがjarやzipファイルからgifなどのファイルを読み込む
アプレットが、jarやzipなどに固めたファイルからgifなどのファイルを取り出すには、java.lang.Class.getResourceを使います。ただし、ブラウザがNetscapeの場合は次の項目を読んでください。
例:
Image img1 = null;
URL url = getClass().getResource("test.gif");
Toolkit tool = Toolkit.getDefaultToolkit();
try
{
img1 = tk.createImage((java.awt.image.ImageProducer)url.getContent());
}
catch(IOException e)
{
System.out.println(e.toString());
}
・Netscapeでarchiveを指定するとネットワークからアプレットが実行できない
<APPLET>タグのarchiveにjarやzipファイルを指定して、Netscapeでネットワークから(ここで言うネットワークとは、インターネットではなく、他のマシン上においてあるアプレットをLANなどからダウンロードして実行する場合)開こうとすると、class can't init new と表示され、実行されません。これを回避するには、codebaseの指定に"./"を指定します。
例:
<applet codebase="./" code=test.class archive=test.zip width=250 height=50>
</applet>
・Netscapeでjarやzipファイルからgifファイルを読み込む
Netscapeは、アプレットがjarやzipのような圧縮ファイルからgifファイルを読み込もうとしても失敗します。これを解決するには、java.lang.Class.getResourceAsStreamを使います。
例:
InputStream is;
ByteArrayOutputStream baos;
Image img1;
is = this.getClass().getResourceAsStream("test.gif");
if (is == null)
baos = new ByteArrayOutputStream();
try
{
int c;
while((c = is.read()) >= 0)
img1 = getToolkit().createImage(baos.toByteArray());
}
catch(IOException e)
{
}
・NetscapeでサーバにPOSTを送信する
Netscapeからでは、アプレットがjava.net.URLConnection.getOutputStreamをしてもPOSTメッセージを送信してくれません。送信するには、クローズした後にURLConnection.getInputStreamをします。
例:
URL url = new URL("http://"+host+":"+port+"/");
URLConnection connect = url.openConnection();
connect.setDoOutput(true);
PrintStream out = new PrintStream(connect.getOutputStream());
out.println(data);
out.close();
DataInputStream dis = new DataInputStream(connect.getInputStream());
dis.close();
・NetscapeでShift+Reloadをすると、アプレット間通信ができなくなる
これはNetscapeの仕様のようです。詳しくは
http://help.netscape.com/kb/client/981106-5.html
を見てください。
・Netscapeでファイルオープン時にSecurityExceptionが発生する
Netscapeでアプレットをネットワークから実行したとき、ファイルオープン時にSecurityExceptionが発生する場合があります。java.net.URLをnewしたとき、java.applet.Applet.getDocumentBase()を使用している場合は、これが原因です。java.applet.Applet.getCodeBase()を使用するようにすれば、うまくいくと思います。
例:
try
{
URL url = new URL(getCodeBase(),"test.txt");
DataInputStream dis = new DataInputStream(url.openStream());
}
・画面のサイズを取得する
ダイアログを真中に表示するために、ディスプレイ画面のサイズを取得する必要があるときがあります。以下のようにすれば、画面のサイズを取得できます。
例:
Toolkit tk = getToolkit();
Dimension dm = tk.getScreenSize();
int x = dm.width;
int y = dm.height;
・アニメーション時のちらつきをなくす
文字や画像を動かそうとして、何度も再描画すると、画面全体がちらついてしまいます。これを解決するには、ダブルバッファリングを用いるといいです。
例:
Image offImage;
Graphics offGraphics;
public void init()
{
Dimension d = size();
offImage = createImage(d.width,d.height);
offGraphics = offImage.getGraphics();
}
public void update(Graphics g)
{
}
public void paint(Graphics g)
{
offGraphics.drawImage(image_back, x1, y1, this); //アニメーションさせたい画像
offGraphics.drawString(str, x2, y2); //アニメーションさせたい文字列
g.drawImage(offImage,0,0,this);
}
上の例のようにして、スレッドからrepaint()を呼ぶと、ちらつくことなくアニメーションができるようです。
・PanelやCanvasクラスでダブルクリックを検出する
PanelやCanvasクラスを拡張して使ったときに、ダブルクリックのイベントを取るときは、以下のようにします。
例:
public class TextWindow extends Panel
{
public TextWindow()
{
super();
addMouseListener(new MouseListener()
{
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 1)
{
}
else if (e.getClickCount() == 2)
{
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
});
}
}
・文字化けの対処
文字列を取得したときに文字化けする場合は、以下を試してみてください。
例:
○SJIS->Java
String str = new String(s.getBytes("8859_1"), "SJIS");
○Java->SJIS
String str = new String(s.getBytes("SJIS"), "8859_1");
・ファイルのサイズを取得する
ファイルサイズをバイト数で取得するには、以下のようにします。
例:
long size = new File("test.java").length();
・アプレットでブラウザを判別する
アプレットでブラウザを判別するには、以下のようにします。
例:
System.getProperty("java.vendor").startsWith("Microsoft"))
{
}
else
{
}
・アプレットの印刷
アプレット全体を印刷するには、以下のようにします。
例:
Toolkit tk = Toolkit.getDefaultToolkit();
PrintJob pj = tk.getPrintJob((Frame)getParent(), "Print", null);
if (pj != null) {
Graphics g = pj.getGraphics();
this.printAll(g);
g.dispose();
pj.end();
}
|