JTextPaneを使用して構文強調にチャレンジしてみました。 動作は完璧ではありません。構文強調ではJTextPaneを使用しないほうがいいようです。
JTextAreaを使用してテキストエディタを作成しました。構文強調機能は無いシンプルな見た目のエディタです。動作も比較的スムーズです。
JTextPaneを使用して構文強調にチャレンジしてみました。 動作は完璧ではありません。構文強調ではJTextPaneを使用しないほうがいいようです。
JTextAreaを使用してテキストエディタを作成しました。構文強調機能は無いシンプルな見た目のエディタです。動作も比較的スムーズです。
JTextPaneを使用してチャレンジしてみました。
JTextPaneを使用しています。色は属性(SimpleAttributeSet)で指定。一文字入力するごとに1行だけ文字列を取り出して検索しているのでストレスはあまり無いと思います。複数行のコメント「/* */」の構文強調にはまだ対応していません。Grep機能を追加したので選択したディレクトリ内のファイルを検索できます。行番号表示などSUNのサイトにあるソースを参考にしました。ソースを見る力にはなったと思います。
JTextPaneから行単位で文字列を取得すればキーワード検索が短くなるので動作に影響があまり出ないと思います。しかし、複数行コメント「/* */」は何行あるか予測できないので厄介です。複数行コメントだけ別に全テキスト検索すると1文字入力するごとに全部検索するので動作に影響が出てしまいます。入力した位置近くの複数行コメントを判定する処理で解決できそうです。
ファイルを開いた時に全テキストを構文強調する時にチョットコツがあり、小分けにすると長いテキストでも動作が速くなります。私はJTextPaneから200文字程度文字を分割して取得して構文強調しています。実は200文字目にキーワードがあると構文強調出来ていません。 これも行単位で文字を取得するように改良すれば解決出来ると思います。(時間があり次第解決します)
参考サイト1 http://www.cs.bris.ac.uk/Teaching/Resources/COMS30122/tools/
少しソースを読んでみましたが、JTextPaneにあるキーワード単語を検索しその位置情報を持っておき次にその位置情報の文字色を変更する手順みたいです。このサイトの検索の方法は難しく私には難解です。私の検索の方法は単純に正規表現で分割して検索しているのでこのサイトの方法とは違います。
SyntaxHighlighter.javaクラスでJTextPaneを継承しpaintComponentをオーバーライドしていますがそのpaintComponentで検索しているようです。そのとき分割して検索しているのを参考にしました。
参考サイト2 http://java.sun.com/products/jfc/tsc/articles/text/editor_kit/
SUNのサイトにJEditorPaneで構文強調をするサンプルがあり試してみました。暇があればソースを読んでみようと思います。実行するとエラーが沢山出たり構文強調がズレたりします。 後ほど原因を確かめようかなと思います。
古いJDKを使用しているのでコンパイルにはCLASSPATHを設定する必要があり、Eclipseを使用する場合にはパッケージエクスプローラーから右クリックして「プロパティー」「Javaのビルド・パス」「ライブラリー」タブの「外部JARの追加」でJAVA_HOME\lib\tools.jarを追加する必要があります。
左側のJTreeにこのテキストエディタを配置したカレントディレクトリを表示しています。マウスのダブルクリックでディレクトリは展開して表示、ファイルの場合はエディタで開きます。 マウスの右クリックでポップアップメニューを表示します。表示しているディレクトリはポップアップの「上へ移動」を選択で移動できます。
行番号表示は結構大変でした。このサイトを参考にしました。http://forums.sun.com/thread.jspa?forumID=57&threadID=5233100 JListを使用して表示しています。JScrollPaneのsetRowHeaderViewに配置することで表示します。 行番号表示で悩むポイントは1.「行数の取り方」2.「テキストと行数を一致させる方法」だと思います。
1.「行数の取り方」
/* 行数を取得したいJTextComponentからElementクラスを取得 */
Element root = textComponent.getDocument().getDefaultRootElement();
/* キャレットの位置にある行番号を取得 */
int offset = textComponent.getCaretPosition();
int currentLine = root.getElementIndex(offset);
/* テキストの最大の行数を取得 */
int line = root.getElementCount();
javax.swing.text.Elementを使用して行数を取得できます。キャレットの位置からその行番号も取得でき、テキストの最大の行番号も取得できます。AbstractListModelクラスを継承して行数の値を表示設定しています。
行番号とテキストを一致させるためには表示テキストの文字の高さと幅の情報が必要です。
テキストエディタ左上のメニューから検索を選ぶと検索ダイアログが表示されます。
左側に表示しているディレクトリまたはファイルを右クリックするとポップアップメニューを表示します。そのメニューからGREPを
選択するとGREP検索ダイアログが表示され検索文字を入力し検索できます。 ディレクトリの再帰検索には対応していません。
このGREP機能はjavaの「New I/O」java.nioを使用しています。J2SE1.4から導入されたそうです。
参考にしたサイト http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/io/example/index.html
ファイルを開くとタブで表示するようにしました。同じファイルが開いている場合はそのタブに移動します。
左上メニューの新規作成で新しいタブが作成されます。
参考にしたサイト http://terai.xrea.jp/Swing/TabWithCloseButton.html
解凍して出来たjarファイルをダブルクリックで起動できます。
コマンドプロンプトでは 「java -jar JARファイル名」 で起動できます。
例、 java -jar texta.jar
jre 1.6 以上で動作します
文字コードは「JISAutoDetect」をInputStreamreaderに使用しました。 保存の場合はOSのデフォルトの文字コードで出力します。
実験的に作っていました。ソースを読む勉強にもなったかなと思っています。 実験的に作ったものなのでご自由に使用しても結構です。なにかライセンスが含まれている場合はそれに従います。有用な情報ありがとうございます。