[index.html]

▼CoffeeMaker開発記▼

■その9・JavaとSwingコンポーネント…改行文字についての考察■

●JavaのGUIには、ネイティブ環境のコンポーネントを流用するAWT(Abstract Window ToolKit)と、Java独自のGUIを提供するSwingがあります。
ここでは主にテキストコンポーネントの挙動について考察したいと思いますが、非常に特徴的なのは改行文字の扱いです。

改行文字とは文章中での改行を指示する文字ですが、OSにより改行文字が違うため、例えばMacで作成されたテキストをWindowsで表示させても黒い■が入っている様な状態になります。
ちなみにMacでは\r(0x0d)UNIXでは\n(0x0a)Windowsでは\r\n(0x0d+0x0a)を改行として処理します。

Javaはマルチプラットフォームなので、作成されたアプリケーションは基本的にどのOS上でも動作します。ということは改行文字を特定したコンポーネントを作成してしまうと、問題が生じてしまいます。
AWTではこの問題を完全には対処できないようで、例えばMac上でWindowsで作成されたテキストを開くと、改行が2度された状態で表示されます。

\rも\nも改行として処理する為、こういった状態になるのだろうと想像されますが、AWTは今回の主題からずれていますので、ひとまずSwingのコンポーネントの話をしたいと思います。
Swingでも\rや\nを全て改行文字として扱います。
ただ、\r\nというような場合(Windows改行)も1文字の改行文字として扱います。
また、Swingのテキストコンポーネントは、表示と処理部分が分離しています。表示部分では改行は\nで表現されています。

SwingのテキストコンポーネントにgetText()をし、その文字列に対して\rを検索しても検索できません。
改行文字を探す事は比較的まれな事だとは思いますが、複数の環境で作業をする時や、一般的なWebサーバにCGIプログラムをアップする際には問題となる場合もあります。

また、一つのテキストファイル内に複数の改行コードが混在する場合も考えられます。
こうした場合、テキストコンポーネントごしにテキストを操作するのではなく、バックグランドのコンポーネントに直接命令する方法をとった方がベストだと思います。
(ファイル内容を一時的にStringオブジェクトとして取り込み、操作する方法もありますが、読み込み時にしか利用できない点を考えると多少問題があるかと思います)

[前の話][トップページ][Java Software][CoffeeMakerトップ]