TITLE:Java Tips
RIGHT:Posted by &author(aterai); at 2011-01-25

* Java Tips [#t866d432]
#contents(big)

** 概要 [#y77453b1]
Java のデバッグ(Swing)、Java用のバッチファイル、API-doc 翻訳などに関するメモをまとめています。

* Swing debug agent[#l59af361]
- [[Swingコンポーネントの再描画をJXLayerのDebugPainterを使ってデバッグ>Tips/DebugPainterAgent]]
-- JXLayer のDebugPainter を使ってコンポーネントの再描画を可視化する javaagent を作成してデバッグを行います。

- [[SwingアプリケーションのLookAndFeelを外部から切り替える>Tips/LookAndFeelDebugAgent]]
-- SwingアプリケーションのLookAndFeelを agent を使って外部から切り替えてデバッグします。

* Javadoc 翻訳 [#h4010d75]
[[Javadoc]]
- [[Javadoc/Japanese]]
-- 日本語訳で修正した方が良さそうなもの。
- [[Javadoc/Nitpick]]
-- 翻訳元から修正した方が良さそうなもの。
- [[Javadoc/Typo]]
-- Typo、変換ミスなど。
- [[Javadoc/JDK7]]
-- Java SE 7 API のドキュメントで未翻訳なもの(主にSwing関係)。

* JRuby [#rd5be1f5]
- [[JRuby]]に移動

* 「Java Swing Hacks」本のレビュー [#ef1cba4d]
- [http://d.hatena.ne.jp/aterai/20060502 「Java Swing Hacks」本のレビュー - てんぷらメモ@はてな]
-- [http://d.hatena.ne.jp/aterai/searchdiary?word=%2a%5bSwing%20Hacks%5d 記事一覧]
-- [http://d.hatena.ne.jp/aterai/archive?word=%2a%5bSwing%20Hacks%5d タイトル一覧]

* Java その他 [#i6c38ca4]
- [[環境変数JAVA_HOMEを変更して使用するJDKを切り替える>Tips/SetJAVA_HOME]]
-- 環境変数 JAVA_HOME を変更するバッチファイルを作成して、コマンドプロンプトで使用するJDKを切り替えます。

- [[Rhinoでgoogle-prettify.jsを実行する>Tips/GooglePrettifyRhino]]
-- Rhinoでgoogle-prettify.jsを実行し、ソースコードをハイライトされたHtml(google sites用)に変換します。

- [[Java API Doc の「日本語、英語」をブックマークレットで切り替える>Tips/APIDocEnJa]]
-- JavaのAPIドキュメントをブックマークレットを使って、日本語と英語で切り替えます。

- [[JNIでJFrameのHWNDを取得>Tips/JNI_HWND]]
-- JNI(Java Native Interface) で JFrame(SunAwtFrame) の HWND(ウィンドウハンドル) を取得します。

* Java メモ [#afdfdb63]

** 環境変数 [#n357d6c7]
- http://cr.openjdk.java.net/~gbenson/zero-08/raw_files/new/hotspot/src/share/vm/utilities/vmError.cpp
#code{{
// List of environment variables that should be reported in error log file.
const char *env_list[] = {
  // All platforms
  "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
  "JAVA_COMPILER", "PATH", "USERNAME",

  // Env variables that are defined on Solaris/Linux
  "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
  "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",

  // defined on Linux
  "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",

  // defined on Windows
  "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",

  (const char *)0
};
}}

** コマンドプロンプトからデフォルトのロケールを変更 [#p9b18e96]
 > javac -J-Duser.language=en Test.java

 > java -Duser.language=en Test

- [http://java.sun.com/javase/technologies/core/basic/intl/faq_ja.jsp#set-default-locale Java 国際化 FAQ]
 アプリケーションの外部からデフォルトのロケールを設定できますか。
 
 使用している Java プラットフォームの実装によって異なります。通常、初期のデフォルトロケールは、ホストオペレーティングシステムのロケールによって決まります。Sun の JRE のバージョン 1.4 以降では、コマンド行から user.language、user.country、および user.variant の各システムプロパティを設定することで、初期のデフォルトロケールを変更できます。たとえば、初期のデフォルトロケールとして Locale("th", "TH", "TH") を選択するには、次のコマンドを使用します。
 java -Duser.language=th -Duser.country=TH -Duser.variant=TH MainClass
 
 この機能を使用できない実行環境もあるため、この機能はテスト目的だけに使用してください。

** コード整形 [#k1323c34]
個人的な好みと習慣で、Javaのソースコードのインデントは、エディタでは4space、Webサイトにソースコードを表示する場合は2spaceにしているので、xyzzy などのエディタから以下のように整形。

 astyle --style=java --mode=java --indent=spaces=2
 astyle --style=java --mode=java --indent=spaces=2 Hoge.java

Markdown 形式の Stack Overflow などにソースコードを貼り付ける場合は、以下のようにして、行頭にタブ(またはスペース4つ)を追加。

 astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/\t\1/"
 astyle --style=java --mode=java --indent=spaces=2 | sed -e "s/^\(.*\)$/    \1/"

** ソースコードのコピー [#c8b1879b]
Java に限らず、以下、Opera 12.50で、Clipboard API を使い、preタグで囲まれたソースコードを簡単にコピーする方法のテスト。

- [http://d.hatena.ne.jp/aterai/20080725/1216954636 preタグで囲まれたソースコードを簡単にコピーする方法 - てんぷらメモ@はてな]
- [http://www.w3.org/TR/clipboard-apis/ Clipboard API and events]
- [http://my.opera.com/desktopteam/blog/2012/07/06/marlin-1250-swim Opera Desktop Team - First bite of 12.50 ‘Marlin’: Clipboard API, redesigned key event handling, -webkit- CSS, and Notification Center]
- [http://domes.lingua.heliohost.org/webapi/intro-webplatform1.html#section-1-3 クリップボード API - Introduction to the Web Platform - DOM ECMAScripting]

#code{{
(function() {
  var listener = function(e) {
    var tx = document.createElement("textarea"),
        div = document.createElement("div"),
        closeListener = function(e) {
      switch(e.type) {
        case 'copy':
        case 'cut':
          var dataTransfer = e.clipboardData;
          dataTransfer.items.add(this.innerText, 'text/plain');
          this.parentNode.replaceChild(this.originalPre, this);
          e.preventDefault();
          break;
      }
    };

    tx.style.width  = parseInt(getComputedStyle(this,"").width).toString()+"px";
    tx.style.height = "240px";
    tx.originalPre  = this;

// ctrl-c 無しでコピーできるかもと思ったけど…
//       var event = new ClipboardEvent('copy', { bubbles: true, cancelable: true } );
//       var dataTransfer = event.clipboardData;
//       dataTransfer.items.add("aaaaaaaaaaaaaaaaaaaaaaa", "text/plain");
//       //this.parentNode.replaceChild(this.originalPre, this);
//       document.dispatchEvent(event);
//       //event.preventDefault();

    tx.addEventListener("keydown", function(e) {
      if(e.keyCode=="27") { // ESC
        this.parentNode.replaceChild(this.originalPre, this);
      }
    }, false);
    tx.addEventListener("dblclick", function(e) {
      this.parentNode.replaceChild(this.originalPre, this);
    }, false);
    div.innerHTML = this.innerHTML.replace(/<br[ \/]*>/ig, "\n").replace(/<.*?>/mg, "");
    tx.value = div.childNodes[0].nodeValue.replace(/\xA0/g, ' ');
    this.tx = tx;
    this.parentNode.replaceChild(this.tx, this);
    this.tx.focus();
    this.tx.select();

    tx.addEventListener('copy',     closeListener, false);
    tx.addEventListener('cut',      closeListener, false);
  },
  pre = document.getElementsByTagName("pre"),
  i = 0, len = pre.length;
  for(; i<len; i++) {
    pre[i].addEventListener("dblclick", listener, false);
  }
}());
}}

* コメント [#k546af30]
- [[Nitpick]]を[[Javadoc]]以下に分割して移動。 -- [[aterai]] &new{2011-11-11 (金) 16:57:12};

#comment