Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTextPane タブサイズの設定について。

テキストエディターでキャレットの位置を取得してそこの行番号を表示さようとしてJTextPaneにCaretistenerを付けています。
JTextPaneのデフォルトのタブサイズでは大きすぎるので変更したいと思い、以下のサイトを見つけました。

JTextPaneにタブサイズを設定するには|普通に仕事しながら趣味でソフト開発する37歳いろいろメモ
http://ameblo.jp/ogitsu-hama/entry-10066055266.html

そこに書いてある以下のコードでタブサイズを設定できることはわかりました。

int tabSize=5; //設定したいタブサイズ(文字数)
FontMetrics fm = jtextPane.getFontMetrics(textPane.getFont());
int charWidth = fm.charWidth('m');
int tabLength = charWidth * tabSize;
TabStop[] tabs = new TabStop[10];
for(int j=0;j<tabs.length;j++) {
tabs[j] = new TabStop((j+1)*tabLength);
}
TabSet tabSet = new TabSet(tabs);
SimpleAttributeSet attrs = new SimpleAttributeSet();
StyleConstants.setTabSet(attrs, tabSet);
jtextPane.getStyledDocument().setParagraphAttributes(0, 
jtextPane.getDocument().getLength(), attrs, false);

TabStopクラスでピクセル単位でタブサイズを設定するのだと思ったのですが、なぜTabStopの配列を作るのか、なぜtabLengthではなく(j+1)*tabLengthに設定するのか、なぜその配列をTabSetクラスに渡しているのかが分かりません。
できればこれらについて使う前に理解したいと思ったので質問させてもらいました。

TabSet型にしているのはStyleConstants.setTabSetの引数の型に合わせるため(だけってわけではないでしょうけども)だと思いますが、そのTadSetクラスがよくわかりません。
ドキュメントに以下のように書いてありましたが、どういうことなのかよくわかりませんでした。

「タブセットは、多くのタブストップで構成されます。タブセットは、指定された位置にもっとも近いタブストップを見つけたり、すべての潜在的なタブストップを検索したりするメソッドを提供します。タブセットは変更できません。 」

5

回答

94587

閲覧

5件の回答

評価

0

>型に合わせるため(だけってわけではないでしょうけど
も)

「なぜこの型を渡すのか」は「設計者がそういうクラスを
使って実装しようと意図したから」という答えになってし
まいますが質問者さまはおそらくなぜこういうややこしい
ことをするのだろうという疑問をもたれたのですね?

>TabStopの配列を作るのか
>tabLengthではなく(j+1)*tabLength
>その配列をTabSetに渡す

ひょっとしたら質問者さまは「各タブを80ピクセルごとに
して」といった単純な指定でない点に疑問を持たれている
と思えます。

スタイル付きドキュメントの設計者は「タブ位置」を、各
ライン上に任意の間隔で望む数だけ設定できることを意図
しています。
例えば下のTの位置のようにタブを設定できます。つまり
各タブ位置の間隔がばらばらでいいようになっているので
す。

ライン:..T......T...T.......T....T.....

上の図のライン上のタブの位置(T)をTabStopオブジェクト
で表現し、ライン上にある全てのTabStopオブジェクトの
集合をTabSetオブジェクトが保持するという設計となって
いるわけです。

この仕様に対して、全てのタブの間隔を一定としたい場合
は、各々のタブストップの位置を間隔(=tabLength)の整数
倍に設定することになり、サンプルコードではそういうこ
とをしています。

評価

0

JTextAreaだったらsetTabSize(int)で設定できるじゃないですか。
(そこでの単位はわかっていませんでしたが、私はそれで2に設定したときの幅がちょうどよかったりします。)
それに対してJTextPaneがピクセル単位で設定できるのはJTextAreaより自由度があるからだと思いますが、シンプルにタブのサイズを1つ指定すればいいわけではないのがまずなぜだろうと思いまして。
でも、それはJTextPaneはさらに自由度が高くてタブごとにサイズを設定できるようになっているからなんですね。

配列を作ったりする理由はわかりましたが、要素数が10なのはどういった理由なんですかね?
以下のサイトでは50に設定しているようですが、この要素数はどういう決まりでいくつに設定するのがいいんでしょう?

Java - エディタを作る
http://abebas.sub.jp/java/JavaPrograming/01_Editor/012.html

評価

0

Java とかプログラムの前に「Tab」について学んだ方がいいと思います。
Java やコンピューターが出来る以前からある概念です。
当然 JTextArea の設計者も JTextPane の設計者もそれを
取り入れようとしたのでしょう。
そして JTextPane の設計者の方がそれをよりうまく実現する
方法を選んだという事です。

評価

0

>要素数が10なのは

それはエディタのタブストップを決める各アプリケーショ
ンプログラマーが好きに決めればよいことなのです。

「4文字相当のタブにしよう、行の長さはせいぜいこのぐ
らい・・・」と思ったら最大のカラム数から機械的にタブ
ストップの数を決めるなどすればいいです。

また自分用のプログラムエディタを作るとして「インデン
テーションが5を超えるようなコードは絶対にかかない」
という自分ルールがあったとしたら5でいいですしそのル
ールが「絶対にかかないと思うけど余裕を若干みておこう
かな」と思ったら10ぐらいにしてもいいわけです。

自由度があるものの設計は目的に応じて「なぜそうした
か」を納得いく説明があるものに決めればよいと思いま
す。目的がはっきりしていれば自ずと決められると思いま
す。

評価

0

1行にタブ文字をいくつ入れるかなどでTabStop型配列の要素数を決めればいいんですね?
これですべて納得しました。
KSwordOfHasteさん・仙人さんありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。