javax.swing.text パッケージの
Style インターフェイスと AttributeSet インターフェイスの
役割や機能的な違いがよくわかりません。
要するに、「スタイル」と「属性」の違いです。
StyledDocument インターフェイスが公開するメソッドに
setLogicalStyle と setParagraphAttributes があります。
前者は指定した位置の段落にスタイルを設定するもの、
後者は指定した段落の、指定した範囲に属性を設定するもの。
また、文字要素(コンテンツ エレメント)に属性を設定するメソッドはありますが、
スタイルを設定するメソッドは見当たりません。
スタイルが段落(パラグラフ エレメント)にしか設定できないのは
なぜなのでしょうか。
API ドキュメントでは、次のように前者の方の説明をしています。
> 指定された位置の段落に使用する論理書式を設定します。
> 文字および段落の属性に対して明示的に属性が設定されていない場合、
> 属性はその段落に割り当てられている論理書式を介して解釈処理されます。
論理書式というのがスタイルのことなのですよね。
スタイルすらもプログラマによって明示的に指定していない場合は、
おそらくデフォルトのスタイルか属性が設定されている、
あるいは設定されているように View が解釈するのだと思いますが、
それではスタイルの必要性はないように思えます。
また、AttributeSet も Style もともに
「属性のコレクション」であると説明があります。
ただ、Style の方は「ドキュメント内の要素に関連した」という形容句があるので、
ここが AttributeSet と違いを分けるポイントだとは思うのですが、
いまいちよくわかりません。
どなたか、説明していただけないでしょうか。
あるいは、説明がなされているサイトがあれば紹介していただけないでしょうか。
書き忘れました。
j2sdk 1.4.2_02 を使用しています。
APIリファレンスを読んだだけですので間違いがあるかもしれません。
> Style インターフェイスと AttributeSet インターフェイスの
> 役割や機能的な違いがよくわかりません。
これらは、継承関係にあるので、
AttributeSetに機能追加したものがStyleでしょう。
派生して追加されているメソッドを眺めてみると、
AttributeSet - 読取専用の属性セット
+ MutableAttributeSet - 上記に変更機能を加えたもの
+ Style - さらに変更の通知機能を加えたもの
となっているのが分かります。
> StyledDocument インターフェイスが公開するメソッドに
> setLogicalStyle と setParagraphAttributes があります。
> 前者は指定した位置の段落にスタイルを設定するもの、
> 後者は指定した段落の、指定した範囲に属性を設定するもの。
> また、文字要素(コンテンツ エレメント)に属性を設定するメソッドはありますが、
> スタイルを設定するメソッドは見当たりません。
setLogicalStyle: これは、指定した段落のデフォルト属性を設定する
もののようです。引数のインスタンスそのものが保持されるので、
Styleインターフェイスを要求しているようです。
setParagraphAttributes: これは、「段落の指定範囲の属性」ではなく、
「指定した範囲の段落属性」でしょう。
段落属性とは、段落全体に影響する右寄せ左寄せ、字下げといった属性です。
setCharacterAttributes - これは、指定した範囲の文字属性を設定する
ものです。文字属性とは、フォントや文字色などです。
後者の二つは、引数のインスタンスがそのまま保持されるのではなく、
引数から属性を取り出して内部で保持している属性セットに重ね書きされるため、
読み取り用のインターフェイス(AttributeSet)だけを必要とします。
HTMLで言うなら、こんな感じでしょうか。
<p class=defaultStyle align=center>
^^^^^^-logical style ^^^^^^^^^^-paragraph attribute
hello <b>styled</b> string!
</p> ^^^^^^^^^^-character attribute
paragraph attributeもcharacter attributeもデフォルト値を
logical styleから取得するので、Styleの定義は段落に対してのみしかありません。
> setLogicalStyle: これは、指定した段落のデフォルト属性を設定する
> もののようです。引数のインスタンスそのものが保持されるので、
> Styleインターフェイスを要求しているようです
積み重ねるのではなく、置き換えている、ということですね。
そのことに関しては納得できました。
しかし、Style である理由は
引数のインスタンスそのものが保持されるから、ではなくて、
Style の公開メソッドが必要だから、ではないでしょうか。
> AttributeSetに機能追加したものがStyleでしょう
確かにそうだと思い、どのような機能が追加されたものかを見てみると、
書式の名前を取得するものと、属性変更リスナーの設定・削除だけなんですよね。
しかも、このリスナーは何が変更されたのか(source)はわかりますが、
どのように変更されたのかは分からない。
もしそのような機能が必要ないのなら、
StyledDocument.setLogicalStyle メソッドの引数は
MutableAttributeSet で十分だったはず。
デフォルトのスタイルが変更されたときに通知を受けたい、
というのはどういう場合なのでしょうか。
素人的には、デフォルトのスタイルよりは、
setCharacterAttributes メソッドや setParagraphAttributes メソッドの方にこそ、
変更通知が必要な場合が発生しやすいと思ってしまうのですが。
テキストコンポーネントで属性関係が未だによくわかりません。
何でStyleなのかという点については私も良く分かりません。
個人的には、
setDefaultAttributes(AttributeSet...);
setParagraphAttributes(AttributeSet...);
setCharacterAttributes(AttributeSet...);
のようになっていたほうが分かりやすいとは思いますが…