NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
これは2004年11月4日から2006年2月18日までZopeで運用していたCOREBlogの静的なアーカイブです。
新しい日記は「西尾泰和の日記」で運用しています。
現在選ばれているカテゴリー
- Java
絞り込む
マルチカテゴリでの絞り込み機能は静的アーカイブ化の際に停止しました。
[Jython]
[リンク]
[Eclipse]
[雑記]
[EnglishImprinter]
[英語の勉強]
[Python]
Javaで背景画像を
Javaでコンポーネントの背景に画像を表示する方法がわからない。
JPanelの上にJButtonがあるとしよう。普通にpaintメソッドの中でJPanelに画像をdrawImageすると、JButtonの領域の上にまで描画されてボタンが見えなくなる。paintメソッドの中でJButtonをrepaintするとまたpaintメソッドが呼ばれてしまう。JButtonのupdateやpaintを使っても変な位置に描画されるだけ…。
paintメソッドにgetGraphicして与えてやれば、ウィンドウの端に別のウィンドウをかぶせてから表示しなおしたときにだけはうまく表示される。しかし、ボタンを押してJPanelが表示されたときにわざわざrepaintを呼んでいるんだがなぜそこでちゃんと描画されないんだ…。
背景画像の設定
背景画像を設定するために文字の入っていないJLabelを最大表示で使うなんて、そんなのアリ…?
背景画像の設定:完結篇
今まで
JPanel pnlResult=new JPanel();
とやっていたところを
JLabel pnlResult=new JLabel(new ImageIcon("filename"));
に変えるという結論で。
JBuilderでGUI作成時の盲点
JPanelをJLabelにソースコードレベルで変更したせいでか、GUIデザイン画面での親子関係が壊れてしまった…。
JLabelの文字色
JLabelの文字の色ってどうやって変えるんだろう。
JLabelにsetColorがあるかと思ったらないし、じゃぁFontのほうにあるかと思ったらこっちもないし。
JComponentの文字色設定
JLabelの文字色の設定は、JComponentから継承されているsetForegroundだった。
クラスを実行時にロードするには
比戸君が「ClassLoader」ってキーワードを提供してくれたのでGoogle先生と相談しながら作ってみたらうまく行った。
整理すると、
- 読み込みたいクラスファイルのあるフォルダをSystem.setPropertyでクラスパスに指定する
- getClassLoaderでクラスローダへの参照を取得する
-
loadClass("ファイル名")でクラスオブジェクトを読み込む
- newInstanceでクラスオブジェクトからそのクラスのインスタンスを作成する
といった感じ。ソースコードはExtendの中に入れておきます。
Continue reading "クラスを実行時にロードするには"
Javaで*.exeを起動
まぁ、*.exeに限ったわけではないけど。
try {
Runtime.getRuntime().exec("calc.exe");
} catch (IOException e) {
e.printStackTrace();
}
非常に簡単。
Jampack
---
ftp://math.nist.gov/pub/Jampack/
Javaの行列計算ライブラリ
JSci
JavaにWaveletのパッケージがないか調べてみたら、あった。
JSci.maths.wavelet
というかこのJSciってパッケージ、クラスの一覧を見るとAbelianGroupだのAlkaliEarthMetalだのAminoAcidだのAntiElectronNeutrinoだの、なんというか一言で言うとすごい
BanachSpaceインターフェイスがある…。
いや、MandelbrotMapって…。
MathMLParserなんてのまである…。
なんか四字熟語が頭に浮かぶなぁ、支離滅裂っていうのが。
まぁどの程度使えてどの程度使えないか今度のんびり調べるとしよう。
Javaアプレットにメニューをつける
AppletクラスにはsetMenubarがないんだよ。
AppletのなかにFrameを置いてその上に色々乗せようかとしたら、
containerにwindowを乗せようとした、ってIllegalAgumentExceptionを投げられる。
結局のところ、JAppletにJMenubarをsetJMenubarすることで解決、やれやれ。
メニューが…JPanelに隠されて表示されない…(´・ω・`)
Eclipse→(PuTTY)→SourceForge
SourceForgeのCVS接続方法(Putty+Eclipse)
を参考に設定したけどうまく行かない。
「CVS_RSH」を「C:\cygwin\bin\ssh.exe」にするって書いてあるのは明らかに間違いだろうと思って勝手にputtyjp.exeに読み替えて設定したんだけどね。結局
PuTTYを使ったCVS利用法
を読んでみたらそこはplink.exeにするって書いてあった。
現在当たっている壁
現在突き当たっている問題点を整理してみる。
-
頑張ってJavaアプレットにメニューをつける方法を発見したのに、アプレットに配置したパネルの裏に隠れて表示されない(´・ω・`)
-
Jythonで作ったクラスをJavaプログラムに取り込む方法は、
Javaに下からあるクラスを親クラスにして継承する場合はうまく行ったが、自分で定義したインターフェイスを継承する場合にうまく行かない。Jythonにその自分で定義した情報を伝える必要があると思われるがどうやればいいやら。
-
Jythonインタプリタを使ってPythonコマンドを実行できるアプレットを作ったが、もちろんjython.jarがクラスパスに入っていることが必要。これを全部で1つのjarにまとめたいんだがどうしたらいいのやら。
ふぅ。さて、調べるか。
Antを使ってJavaをビルド
うーん、細かい設定をするにはAntを使うんじゃないかといわれて
Antの勉強中。zipfilesetってのを使って外部Jarを取り込んだJarを出力するところまではうまく言ったんだけど
java.lang.NoClassDefFoundError: org/python/core/PyObject
って言われてしまう。
うーん。ちなみにコードはExtendの中に。
Continue reading "Antを使ってJavaをビルド"
JMenuがJPanelに隠される
こういう状態です。画像↓
追記:しまった、研究してるわけじゃないのがばれてる!
Continue reading "JMenuがJPanelに隠される"
JarにJarを入れる
ようはzipfilesetで解凍されるから、とClass-Pathの値をjython.jarじゃなくてjythonにしてみたのが間違い。jython.jarでよかった。
で、Jarダブルクリックで動くことは確認。でもアプレットタグで埋め込むと
java.security.AccessControlException
が投げられる。セキュリティポリシーの設定とかをやらないといけないのかな、面倒だな。
Continue reading "JarにJarを入れる"
英語ゲーム進捗
せっかくアプレットとしても単体のアプリとしても動くような設計にしたんだけど、やっぱセキュリティポリシーの設定面倒だからアプリだけにしようかなぁ。今、Pythonスクリプトを特定フォルダに入れることで機能拡張できる設計にしてあるんだけど、Jar化してアプレットにしたら機能拡張もへったくれもないわけだし。
で、とりあえずCVSに現在のバージョンを入れようかと思ったんだけど、"failed to create lock directory"っていわれる。ディレクトリのパーミッションを+xしないといけないよ、ってEclipseのFAQには書いてあるんだけど、SourceForgeのリポジトリにどうやってフォルダを作ったりパーミッションをつけたりするんだか。
というか「新規パッケージの作成」でフォルダができてないからそれが原因なんだと思うんだけどねぇ。
まぁ、今から後輩のレポートの手伝いでグラフ理論とグラフをPythonで処理する話をやるのでCVSに入れるのは保留。どうせたいしたものできてないし。
JPanelがJMenuを隠す問題:解決
[forum.java.sun.com]
を参考に、
menu.getPopupMenu().setLightWeightPopupEnabled(false);とか書き足したら表示されるようになったけど…場当たり的解決でなんとなくすっきりしない。
結局何が問題だったんだ。Swingの設計か?
EnglishImprinter beta 0.4
EnglishImprinter.lzh。
時間の計測とか正解率の統計とかスクロールまわりはまだ実装していないけど、
とりあえず任意の英文で穴あき問題が作られて、ボタンをクリックすると答えられるところまではできたのでベータ版として公開。
時間計測と正解率、達成率にスコアを実装。あと、JKL+のキーで1,2,3,4番目のボタンと同じ意味に。v0.41
BioJava In Anger 急いでいる人のためのチュートリアル&レシピ集
---
http://www.geocities.jp/bio_portal/bj_in_anger_ja/
EnslishImprinterをSourceforgeに入れた
EnglishImprinter
結局のところEclipseでCVSを使ってSourceForgeに入れようとしたときうまく行かない問題は、Eclipseの側の「パッケージ」のところにSourceForgeのほうの「パッケージ」を入れちゃダメということのようだ。両者で定義が異なる。SourceForgeでeng-imprinterってプロジェクトを作ったら、デフォルトでeng-imprinterってパッケージがあるとSourceForge上では表示されているけど、これはあくまでリリースの上でのくくりであって、CVS上の構造とは無関係なので、Eclipseで指定する「パッケージ」のほうには「.」(カレントディレクトリ)を指定するとうまく行く。この2つの「パッケージ」が同じ意味だと思っていたからつまづいたんだな。
Eclipse-CVS ファイルの削除の仕方
ファイルを削除して同期化をするとエラーが出て、見慣れた画面が出ずに灰色のままになることがある。で、うまく行かないなぁ、どうしたらいいのかなぁ、と今まで思っていたわけだけど。
その灰色の同期化パネルを閉じてみたら後ろにタスクパネルがあって、そこに「〜はローカルで削除されています」と表示されていた。ダメモトで「高速修正」を選んでみたら修正リストが出て、「削除をCVSに確定」が選択肢にあった。
というわけでそれを選んで無事削除完了。
UMLプラグインを試す
EclipseUMLプラグインを試してみたり。
Continue reading "UMLプラグインを試す"
SWTサンプル集
---
http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/swt?page=FrontPage
研究用のプログラム、メインのアルゴリズムは昨日Pythonで作ってしまったので、後は可視化のためのGUI。GUIを作るうえで、Delphi、C++、Javaという3つの選択肢を眺めるとやっぱりJavaがよさそうな気がするし、JavaのAWT、Swing、SWTっていう3つの選択肢を眺めるとやっぱりSWTがいいような気がするわけだ。
SWT体験記vol.1
import org.eclipse.swt.widgets.Display;
で、インポートできないと怒られた。
swt.jarをビルドパスに追加する必要がある。どこにあるかな…あった。
C:\eclipse3\plugins\org.eclipse.swt.win32_3.0.1\ws\win32\swt.jar
あとは
C:\eclipse3\plugins\org.eclipse.swt.win32_3.0.1\os\win32\x86\swt-win32-3063.dll
をプロジェクトのルートに置いておけばOK。
さて、ウィンドウを出して遺伝子をリスト表示するところまでは1時間程度でできた。次は可視化だ。というわけでSWTでCanvasに描画する方法。
できたできた。でもレイアウトが…。setLayout(null)してあるのに勝手にリサイズしてくれる…。
というわけでSWTアプリケーションでのレイアウト
どれを使うか悩んだけど、結局GridLayoutにした。
「GridLayoutには、レイアウト方向の概念自体ありません。」
なんて書いてあるけど、numColumnsはあるのにnumRowsはない。
おかげで横方向のサイズ変化にはちゃんと自動的にレイアウトしてくれるけど、たて方法のサイズ変化には対応してくれない。
うーん。まぁいいや、先に可視化のほうを済ませよう。
あ、ちょうど9時だ。
クエリー決めうちで可視化を実装。次はリストから選んだアイテムをクエリーにする。というわけでリストにイベントリスナを追加する方法だ。
addSelectionLisnerを使うのかと思ったら違うようだ。これによれば
list = new List (shell, SWT.BORDER | SWT.V_SCROLL);
list.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
refreshObject ();
}
});
とやるらしい。あれ、でもevent.itemもevent.detailもevent.dataもまともなデータが入ってないなぁ。リストの選ばれた項目を取得するのってどうするんだろう…。
ああ。SWT Snippets ソースコードによるとListのインスタンスがそれを提供するメソッドを持ってるんだそうな。getSelectionIndex()か。
できあがり。やれやれ、これでとりあえず2/4のプログレスで「なにも新しい研究成果がありませんゴメンナサイ」って事態は避けられた。予想通り割と面白い結果が出ることがわかったので一安心。
後はソフトの使い勝手をもうちょっとよくしたり、
Python2.3では枯草菌のデータを丸ごと入れても大丈夫だったのにJythonに変えたらメモリー不足エラーが出るようになったのでデータのほうを20分の1に削って使ってるんで全データでできるようにしたりしないとね。
Javaは
double[] を宣言時に勝手に0.0で初期化するんだったら、doubleも宣言時に0.0で初期化すればいいのに。
SWTで画像を扱う
さて、発表は終わったのでほっと一安心。
というわけで昨日思いついて実装したいのを我慢していたプログラムを実装開始。
最初Javaで画像を読み込む方法をGoogleった時にawtの例が出てきたのでそれを使いかけたけど
http://cjasmin.fc2web.com/samples/saving_image.html
http://www-6.ibm.com/jp/developerworks/java/040702/j_j-2dswt.html
SWTでもむずかしくなさそうだからSWTを使うことにしようっと。
アプレットで動かす必要性がないし。
矩形波をつくろう
---
http://yuri.sakura.ne.jp/~propella/tips/RectWave.html
Javaによる音合成の方法
CGView - Circular Genome Viewer
---
http://wishart.biology.ualberta.ca/cgview/
CGView APIの説明。ちゃんとライブラリとして使えるようだからこんどチャンスがあったら使ってみよう。
JUnit
会社でASCIIのEclipse3.0の本を読んでる。流し読みした感じではSOFTBANKのほうより僕の興味にあっていたから。
てすとくどーぷろぐらみんぐ。というわけでJUnitをかじってみた。うん、とりあえずわかったことは「工数が増えてめんどくさーい」ってのと「可視化プログラムには使いにくいなぁ…」ってことか。
さて、次はりっちくらいあんとぷらっとふぉーむだ。
久しぶりにAntを使う
EclipseのJarエクスポート機能でクラスパスに設定してある外部jarも全部まとめてくれると楽なんだけどねぇ。jython.jarとswt.jarを使っているので。
Antでjavacのclasspathに要素を足そうと思って
<javac srcdir="${src.dir}" destdir="${classes.dir}">
<classpath>
<include name="some.jar">
とかやると怒られた。
正解は
<pathelement location="some.jar" />
だけど、なんで区別する必要があったのかは謎。
JNIって意外と簡単そう
JavaでHello World > JNI編を読んでみたけど意外と簡単そう。
この前作ったフックDLLを利用してちょっとしたソフトを(論文書きからの逃避に)作ろうと思ったら、なぜかDelphiが起動しなくなっていたのでかわりにJavaで作ろうかと。それでJavaからDLLを呼び出すのにはJNIかな、と思ったわけだけど…JNI専用にDLLを作らないといけないみたいだね。JNIEXPORT jstring JNICALLとかやってるから。普通のstdcallのは直接は呼び出せないんだろうな。
となると、Delphiで作ったDLLを呼び出すJNIDLLをCで作ってJavaで作ったGUIから呼び出すということに(マテ
いっそのことどこかにPythonを絡められないかな(調子に乗りすぎ)
Delphiで書かれたフックDLLに手を加えてPython用のライブラリにして、JNIDLLにはexecStringやgetAsIntegerなんて感じの関数を実装してJavaとPythonの橋渡しをする、ってのが一番再利用性の高い設計かな。
というかDelphiで書いたDLLに手を加えないで再利用するのがJNIDLLを作る目的だったのだからDelphiで書いたDLLをいじる時点で「最初からそれをJNIDLLにしろよ」と小一時間(ry
XML-RPCでPython→Java→Python
「Java での XML-RPC の使い方」
を参考にしてJavaでサーバを作る。
とりあえず
Apache XML-RPC
のをダウンロードしてxmlrpc-2.0.jarをビルドパスに追加する。
参考文献のコードはserver.addHandlerの次の行にserver.start()が抜けているのでサーバが稼動しないので要注意。
また、サーバが稼動してもリクエストを投げるとエラーが表示されるので何かと思ったら、クラスが見つからない系エラー。
Jakarta Commons Codecのcommons-codec-1.3.jarをビルドパスに入れて直した。
参考文献の独立型サーバを走らせておいて、
以下の3行のコードを実行すると一番下の行の出力が得られる。
import xmlrpclib
server = xmlrpclib.Server('http://localhost:8080/RPC2')
print server.sample.sumAndDifference (10, 20)
{'sum': 30, 'difference': -10}
想像以上に簡単ですね。
XML-RPCを使ってPythonとJavaの間のやり取りをする一番のメリットは、多言語へも手を広げやすい点でしょうか。
次がPython側とJava側が別のマシンで動くことが可能な点で、
逆にデメリットはPython/Javaに特化していないプロトコルだから特化しているJythonに比べれば変換周りが面倒な点かな。
Jar
AntでいつもどおりにJarを作ったのになぜか動かない。コンソールで実行してみる。
C:\eclipse3\workspace\SphSOM\SphSOM 0.01>java -jar sphsomviz.0.01
Exception in thread "main" java.util.zip.ZipException: アクセスが拒否されました
。
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:112)
at java.util.jar.JarFile.(JarFile.java:127)
at java.util.jar.JarFile.(JarFile.java:65)
えっと…。Antで出力するときに空白文字を含んだディレクトリを指定したのがいけなかったのか、な?「SphSOM 0.01」を「SphSOM.0.01」に変えたら動いたが。
若手の会で覚えてきたこと
JavaのDuke[GoogleImage]がペンギンだと知って驚いた。
赤い丸は鼻だと思っていたのに。誰かは「目だと思っていた」とも言っていたような。
変数宣言時以外に配列を直接書く方法
Javaで
int[] a = {0, 1, 2};
というように配列を直接書くことが出来ることはJava使いにはよく知られています。でも、この宣言文がフィールド宣言や引数の宣言など「値を指定したいところから離れたところ」にある場合は直接書くことが出来ません。
a = {0, 1, 2}; // エラー:配列定数はイニシャライザにおいてのみ使用可能
たまたま別の事を調べて人のソースを読んでいたらこういうシチュエーションで使える方法が見つかりました。
a = new int[]{0, 1, 2}; // OK
…なんかヤだなぁ。
釈然としないSingleton
釈然としない。
Singletonは特定のクラスのインスタンスを1つだけ作るパターンだ。
しかし、「インスタンスを一つだけ作る」という目的はSingletonでなければ果たせないわけではない。単に、一番最初に作ったインスタンスを他のオブジェクトのコンストラクタに次々渡していけばいいだけだ。
この方法は、もちろん面倒なものだ。そこで特定クラスFooにpublic Foo getInstance()などと言ったメソッドを作成し、コンストラクタとして渡さなくても他のオブジェクトが参照を入手できるようにする。
ようはJavaではpublic Classはグローバルにどこからでもアクセスできることを利用して本来Javaに存在しないグローバル変数を作り出しているとも言えるのではないか。
インスタンスの一意性についてはJavaの「クラスオブジェクトがファーストクラスのオブジェクトではなくて、実行時に変更が出来ない」という特徴を巧妙に使っていると思うが、今回の話とは絡まないので割愛。
さて、続き。
どうしてこういうことを考えたのか、という経緯について説明しよう。JavaのSWTで色を指定するために使われるColorクラスは不必要になったときに明示的にdisposeする必要がある。かといって、描画のたびにColorインスタンスの生成と破棄を繰り返すのは馬鹿げている。同じ色の頂点が100個ある場合に、それぞれが別個のColorインスタンスを持つのもスマートではない。そこで、Colorインスタンスを保持するColorHolderというクラスを作って、RGBの値を指定してgetメソッドを呼ぶと、もしその色のColorインスタンスがすでにあるならそれを返し、なければ生成して返す。
public static Color get(int r, int g, int b){
Integer rgb=new Integer((b*256+g)*256+r);
if(USER_COLOR.containsKey(rgb)){
return (Color) USER_COLOR.get(rgb);
}else{
Color result=new Color(device, r, g, b);
USER_COLOR.put(rgb, result);
return result;
}
}
つまり、Singletonを実行時にいくつでも動的に生成することが出来る。この例ではハッシュのキーがRGB値になっているが、
キーとして任意の文字列を、格納される値として任意のオブジェクトを受け取ることが出来るようにすれば、グローバル変数として使うことが出来てしまう。
今までMediatorパターンで他のクラスにアクセスしたがっているクラスにmediatorオブジェクトを渡して回っていたけども、mediatorオブジェクト自体がアプリケーションで1つしかないのだからSingletonにしてしまってもいいように思う。そうすればいちいち他のオブジェクトのコンストラクタにmediatorオブジェクトを渡して回らなくてもどこからでもアクセスできる。とても便利だ。
しかし何だかダークサイドに誘われているような気もする。
この道を進んでいいのだろうか。
Antで公開用のパッケージを作成
Ant便利だな。XMLでなければもっと便利なのに。
Pythonスクリプトをコピー、ただしCVSフォルダとoldフォルダと*.class以外。
<copy todir="${release.dir}/python">
<fileset dir = "python" excludes = "CVS,old,*.class"/>
</copy>
適切なフォントサイズを自動選択するテキストボックス
SWTでリサイズ時に処理を行うには
→addControlListenerを使う。ControlListenerにはcontrolResizedがある。
テキストボックスの内容が変化したときに処理を行うには→addModifyListener。modifyTextメソッドが呼ばれる。
残念ながら、かな漢字変換をして複数文字を確定させたときはそのそれぞれの文字に対してmodifyTextイベントが発生するようだ。
文字ごとに処理が行われるのが好ましくない場合はmodifyText内でフラグを立ててタイマーで処理する形になるかなぁ。タイマーを使うと別Threadになるのでいろいろとややこしそうだ。とりあえずSWTの場合はdisplayのスレッドと競合しないようにする必要があるのでdisplay.asyncExecなどを使う必要がある。
というわけで朝チェックアウトした後の待ち合わせから帰りの新幹線にかけて作ったのが下のようなもの。テキストボックスのサイズと中身の文字列の長さによって自動的に適切なフォントサイズを選択してくれるテキストボックス。
高橋メソッドでプレゼン資料を作る場合とか、タブレットPCでテキストボックスを使って文章を入れるときとか、いつも「四角を書く→中身を入れる→いい感じになるようにフォントサイズをいろいろ変えて試す」という手間があってイヤだったので作ってた。タブレットPC用の「自分にとって使いやすい」ノートソフトを作る第一歩ということになるかな。
追記。modifyTextメソッド内でフォント変更の処理を行うと、仮名漢字変換から複数文字を確定させた場合に文字ごとにフォントを変更して再描画するのでルパン三世のオープニングにようにタタタタタタと表示されてしまう。目に優しくない。
modifyTextでフラグを立てて、メインループのdisplay.sleep直前で処理するようにしたら改善されたように思える。
しかしまだ時々ちらつくのは表示用のテキストボックスをフォントサイズ計算用に流用しているせい。これはテスト用だからこうなっているけど実際はノートにぺたぺたと複数のテキストボックスが貼り付けられることになるので、画面外に1つ計算用のテキストボックスを配置してそれを使うことになるだろうな〜。
ソースコード。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
public class ProperText implements ModifyListener, ControlListener {
private static Text text;
private static Display display;
private Font font;
private int fontsize;
private boolean scheduled;
public static void main(String[] args) {
display = new Display();
Shell shell = new Shell(display);
text = new Text(shell, SWT.BORDER + SWT.MULTI + SWT.WRAP);
ProperText p = new ProperText();
text.addModifyListener(p);
text.addControlListener(p);
shell.setLayout(new FillLayout());
shell.layout();
text.setFont(new Font(display, "MSゴシック", 16, 0));
p.scheduled = true;
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
if (p.scheduled) {
p.calcProperFontsize();
}
display.sleep();
}
}
display.dispose();
}
public void modifyText(ModifyEvent arg0) {
scheduled = true;
}
public boolean isOK() {
int height = text.getLineCount() * (text.getLineHeight() + 1);
if (height > text.getClientArea().height) {
return false;
}
return true;
}
public void changeFontsize() {
font = text.getFont();
FontData fd = font.getFontData()[0];
fd.setHeight(fontsize);
font.dispose();
font = new Font(display, fd);
text.setFont(font);
}
public void calcProperFontsize() {
text.setVisible(false);
font = text.getFont();
FontData fd = font.getFontData()[0];
fontsize = fd.height;
int step = fontsize;
fontsize = 0;
int dir = 1;
boolean startDash = true;
while (true) {
fontsize += step * dir;
changeFontsize();
if (isOK()) {
if (step <= 1) {
break;
}
if (startDash) {
step *= 2;
} else {
step -= step / 2;
}
dir = 1;
} else {
if (step <= 1) {
fontsize -= 1;
changeFontsize();
break;
}
step -= step / 2;
dir = -1;
startDash = false;
}
}
text.setVisible(true);
text.setFocus();
scheduled = false;
}
public void controlResized(ControlEvent e) {
calcProperFontsize();
}
public void controlMoved(ControlEvent arg0) {
}
}
JWinTab
---
http://www.csl.sony.co.jp/person/rekimoto/java/jwintab/
タブレット情報を取得するためのWINTABをJavaから使えるようにラップしたもの。とりあえずこれを使って簡単なノートソフトを作ってみるかな。
Powered by COREBlog
NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
Contact me: coreblog"at mark"nishiohirokazu.org
Access counter: This Page:238072
Total:1835851 during 2004/01/23-2006/03/26