未分類チップス

トップ > チップス > 未分類チップス
2012-02-13, misc

/tips/java/misc **Fedora Core 5上で日本語を表示させる 以下の操作で完了。意味はよく分からず。 :# mkdir $JAVA_HOME/jre/lib/fonts/fallback :# cd $JAVA_HOME/jre/lib/fonts/fallback :# ln -s /usr/share/fonts/japanese/TrueType/kochi-gothic.ttf ./

**swingのアンチエリアシング VMの実行時パラメタに以下を追加すると、SwingコンポーネントのアンチエリアシングがONになり、少しだけ見栄えがする。 : -Dswing.aatext=true

**ImageIO アプレットで画像を使用する際にImageIO.readを使用してはいけない。 何故かアプレット実行時にImageIOで取得した画像が壊れてしまう。 代替策は??? - http://java.sun.com/j2se/1.4.1/docs/api/javax/imageio/ImageIO.html

**任意の型の配列を引数にする ジェネリクス? :@SuppressWarnings("unchecked") :public T[] trim(T[] target) { : // nullでない要素の数を確認 : int count = 0; : for (int i = 0; i < target.length; i++) { : if(target[i] != null) count++; : } : // nullが一つもなければ終了 : if(count == target.length) return target; : : // 新しい配列を生成する : T[] newInstance = (T[]) Array.newInstance(target.getClass().getComponentType(), count); : // nullでない要素を順番に格納 : for (int i = 0,pos = 0; i < target.length; i++) { : if(target[i] != null){ : newInstance[pos] = target[i]; : pos++; : } : } : return newInstance; :}

**キャッチされない例外を処理する Threadクラスに、キャッチされずにスローされてしまう例外をまとめて扱う方法が用意されています。 :Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){ : @Override : public void uncaughtException(Thread t, Throwable e) { : // キャッチされない例外が発生した場合の処理を記述します。 : }});

**任意のファイル(URL)を関連付けられたアプリケーションで開く (Windows限定です)

RuntimeクラスのexecメソッドとWindowsのcmd.exeのstartコマンドを利用して、Javaプログラムから任意のファイルを開くことができます。ファイルだけでなくURLやフォルダも同様の方法でオープンすることが可能です。 :String start = "cmd.exe /c start"; :Runtime.getRuntime().exec(start+" C:\\\\foo.txt"); :Runtime.getRuntime().exec(start+" C:\\\\bar.ods"); :Runtime.getRuntime().exec(start+" http://lumber-mill.co.jp");

パスにスペースを含む場合、何かしら第一引数にダミーの値を与えた上で、第二引数にダブルクォート付きでパスを渡すとうまくいくようです。 :Runtime.getRuntime().exec(start+" \\"foo\\" \\" C:\\\\foo bar.ods\\"");

参考:{link:http://www.fpcu.jp/dosvcmd/bbs/log/taskkillstart/4-0292.html}

**Java起動用バッチを作る Javaアプリケーションを起動するバッチの記述方法です。直接javaコマンドを呼んでしまうと、画面上にコマンドプロンプトのウィンドウが出現してしまうので、以下のようにして表示を抑制します。

:@echo off :start javaw -cp ;./lib/* foo.Main

メイン関数を持つクラスが一つしかない場合、jarファイル内のマニフェストに「Main-Class: 」を指定する方法もあります。

**実行ホストの名前を取得する ローカルホストのgetHostNameメソッドでホスト名(Windowsではコンピュータ名)を取得することができます。 :String hostname = InetAddress.getLocalHost().getHostName();

**privateメソッドをクラス外部から呼び出す JUnitでのテスト時など、隠蔽されているメソッドにアクセスしたい場合に利用します。getMethodではなく、getDeclaredMethodを使用する点、setAccessibleをtrueに設定する点に留意して下さい。また、セキュリティマネージャで制限されている場合は、この方法も使えなくなるようです。 :Foo target = new Foo(); :Class c = Foo.class; : :Method m = c.getDeclaredMethod("setValue", int.class); :m.setAccessible(true); :m.invoke(target, 123); // target.setValue(123);

**直列化されないフィールドを作る transient修飾子をフィールドに付けます。 :class Obj implements Serializable{ : private static final long serialVersionUID = 1L; : : public int i; : : public String str; : : public {strong:transient} InputStream is; : :} 上記例の場合、InputStreamにtransientが付いていないと、直列化時に「java.io.NotSerializableException」が発生してしまいます。

**クリップボードにテキストを渡す java.awt.datatransferパッケージに存在するClipboardというクラスを利用します。 :Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); :StringSelection selection = new StringSelection("any text"); :clipboard.setContents(selection, null);

-参考: {link:http://allabout.co.jp/internet/java/closeup/CU20080602A/}

**インストールされているJREを調べる ブラウザからJavaを利用する際に便利なライブラリがjava.comから提供されています。以下のようにライブラリ(deployJava.js)をロードしてから、getJREsメソッドで、マシンにインストールされているJavaのバージョンを知ることができます。

: :

**ディレクトリの区切り文字を取得する Windowsは「\\(バックスラッシュ)」、Linuxは「/(スラッシュ)」なのですが、Javaでは大抵スラッシュを書いていれば動作します(Fileクラスの仕様)。厳格に使い分けたい時は、Fileクラスのseparatorフィールドを参照するとよいでしょう。pathSeparatorという紛らわしいフィールドもあるので注意が必要です。

:System.out.println("ps="+File.pathSeparator+" s="+File.separator);

:ps=; s=\\

**管理者権限が必要なプログラムを実行する(Vista) 一応、Javaのバグとして登録されているようです。Runtime.getRuntime().exec()を利用して管理者権限が必要なプログラムを実行しようとすると、(UACが反応せずに)IOExceptionを吐いて終了してしまいます。

:java.io.IOException: CreateProcess: ... error=740

以下のURLにもあるように、「myprog」を直接実行せずに、「cmd.exe /c myprog」とすることでとりあえず回避できるようです。

-{link:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6410605}

**画像を半透明に描画する AlphaCompositeというクラスを利用します。0.5fが透明度を指定しているところです。 :Composite c = g2.getComposite(); :g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f)); :g2.drawImage(image, x, y, w, h, null); :g2.setComposite(c);

-参考: {link:http://kyle-in-jp.blogspot.com/2008/08/java2d.html}

**カレンダークラスのメソッド Calendarクラスに宣言されているgetMaximumメソッドとgetActualMaximumメソッドは名前は似ていますが、異なる動作をします。例えば下記のように、「2月」のカレンダーに対して日付の最大値を求めた場合、Actual..の方は2月の最終日を返してくれるのに対し、getMaximumメソッドは「月」の最大値である31を返します。

:Calendar cc = new GregorianCalendar(2009,Calendar.FEBRUARY,1); : getMaximum(Calendar.DATE) = 31 :getActualMaximum(Calendar.DATE) = 28

**[Mac]ターミナルを起動する Mac標準のTerminalアプリを使えると良いのですが、設定方法がよく分からなかったので代わりに(これも標準で入っている)xtermを利用します。「-e」オプションを使用して起動時に実行するコマンドも指定できます。以下の例ではsshでリモートホストへの接続を行っています。

:String[] cmds = {"/usr/X11/bin/xterm","-e","/usr/bin/ssh user@host"}; :Process p = Runtime.getRuntime().exec(cmds);

**[Mac]MacキーボードでWindowsを使う場合の対比表 VirtualBox上にインストールしたWindows Vistaで検証しています。

Control → Ctrl Option → Alt Shift → Shift Command(*) → Windows

Delete → Back space ? → Insert Fn + Delete → Delete Fn + ← → Home Fn + → → End Fn + ↑ → Page Up Fn + ↓ → Page Down

英数/かな → 半角/全角

(*) VirtualBoxのHost keyに割り当てたのと反対側のCommandキー

この記事は役に立ちましたか?