- 締切済み
マウスで選んだ部分を太字にして保存した後、そのファイルを読み込むと太字になっていない。
今、ワードプロセッサを作っています。 このアプリケーションは「読み込み、保存、太字」のボタンをもっています。 ファイルチューザーを使い、ファイルを保存、読み込みは出来るのですが、一つ問題があります。 テキストに書き込んで、マウスで選んだ部分の文字を太字にした後、デスクトップに保存し、それをまた「読み込み」ボタンで読み込むと、太字で保存したはずの文字が太字になっていないのです。 タグを使うと簡単に出来ると言われたのですが、webアプリケーションではないのに、使えるのでしょうか? タグを使う方法、その他、こうすると簡単という方法がありましたら、教えてください。よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- freedom560
- ベストアンサー率46% (80/173)
>私は保存の時点でtxtArea.getText() ←(コードの中ではtxtAreaと書いていますが、textPaneを使っています。) でStringを取得し、ファイルに保存しているのですが、それで、正しいのでしょうか? 当然ただ文章を保存するためには間違いではないですが、No.1さんが書かれているようにStringに文字のフォント情報などは入らないので、今回の場合においては条件をみたさないと思います。 >保存した今のこの時点で、ファイル自体が太字になっているのでしょうか? Stringには太字などの情報は入らないので、単なる文字情報です。というか、保存したファイルをメモ帳か何かで実際に見てみたらどうですか? >freedom560さんのやり方では、保存したVectorの中身をどのようにして、もう一度、txtPaneに表示させるのですか? あまり深くは考えていませんが、NormalクラスとBoldクラスのスーパークラスを作って、スーパークラスにsetCharacterAttributesを呼び出すようなメソッドを入れておいて、forループ中でそのスーパークラスにキャストしてそのメソッドを呼び出すのでしょうか。実際作っているわけではないので、うまくいくかはわかりません。 参考ですが、以下にほぼ同様のものを作っているサイトを見つけました。 どうやら、タグで保存せずにリッチテキストフォーマット形式で保存するRTFEditorKitクラスなるクラスが存在するようです。(自分もはじめて知りました) 保存時にRTFEditorKitクラスのwriteメソッド、読み込むときにreadメソッドが呼び出されていることを確認してください。この方法を使うのが一番早そうですね。(というか、このソースをコピペすると一番早そうですw)
- freedom560
- ベストアンサー率46% (80/173)
>タグを使うと簡単に出来ると言われたのですが、webアプリケーションではないのに、使えるのでしょうか? もちろん使えます。 例えば「あいうえお」で「う」だけを太字にしたいのなら、 あい<b>う</b>えお として保存すればよいのです。そして、このテキストデータを読み込む際にタグ情報をうまく読み込みます。(ここで作りこみが必要です。) あなたが作ったワードプロセッサでどのようにして太字情報を管理しているのかわかりませんが、例えば、 class Normal { String str; } class Bold { String str; } を用意して、ひたすらVectorに代入して文字を作っていたとしたら、読み込むときに Vector vec=new Vector(); BufferedReader br=~; String str=br.readLine(); while(str.indexOf("<b>")>0 && str.indexOf("</b>")>str.indexOf("<b>")) { Normal normal=new Normal(); normal.str=str.substring(0,str.indexOf("<b>")-1); Bold bold=new Bold(); bold.str=str.substring(str.indexOf("<b>"),str.indexOf("</b>")); vec.add(normal); vec.add(bold); str=str.substring(str.indexOf("</b>")+4); } vec.add(str); のようにしてタグを読み込んでいけばいいわけです。(ソースはイメージなので、コンパイルが通るかとか、ロジックが正しいかというのはわかりません) ちなみに、タグを使うとすると、ワードプロセッサ上に"<b>"などの文字が入れられたときのことを考え、"<"や">"をサニタイジングすることが必要になるでしょう。
補足
お返事ありがとうございます。私は保存の時点でtxtArea.getText() ←(コードの中ではtxtAreaと書いていますが、textPaneを使っています。) でStringを取得し、ファイルに保存しているのですが、それで、正しいのでしょうか? 保存した今のこの時点で、ファイル自体が太字になっているのでしょうか? 私は、保存の時点で何かがおかしいと思い、BufferedWriterを使ってどうにか解決しようとしたのですが、うまくいかず。。。いきづまっています。 freedom560さんのやり方では、保存したVectorの中身をどのようにして、もう一度、txtPaneに表示させるのですか? 下にコードを載せてみたのですが、、よかったら見てください。 長くてすみません。。。よろしくお願いします。 public class MyListener implements ActionListener, ConstantsIF { //Field private MyGUI myGui; private int dialog; private boolean onOffBold = false; private boolean onOffItalic = false; private boolean onOffUnderLine = false; Style selectedText; //constructor public MyListener(MyGUI gui) { myGui = gui; } //end constructor public void actionPerformed(ActionEvent e) { // MutableAttributeSet attr = new SimpleAttributeSet(); JFileChooser fChooser = new JFileChooser(); try { if (e.getSource() == myGui.btnOpenFile) { dialog = fChooser.showOpenDialog(myGui); if (dialog == JFileChooser.APPROVE_OPTION) { File fileName = fChooser.getSelectedFile(); BufferedReader bReader = new BufferedReader(new FileReader(fileName)); myGui.txtArea.read(bReader, null); bReader.close(); } //end if } //end if else if (e.getSource() == myGui.btnSave) { dialog = fChooser.showSaveDialog(myGui); if (dialog == JFileChooser.APPROVE_OPTION) { File fileName = fChooser.getSelectedFile(); BufferedWriter bWriter = new BufferedWriter(new FileWriter(fileName)); String txt = myGui.txtArea.getText(); String text = "<html><body><b>"+ "\n"; text += txt + "\n"; text += "</b></body></html>"; bWriter.write(text); bWriter.close(); } //end if } //end else if else if (e.getSource() == myGui.btnClearAll) { myGui.txtArea.setText(CLEAR); } //end else if else if (e.getSource() == myGui.btnBold) { onOffBold = !onOffBold; // selectedText = styleContext.addStyle("selectedText", defaults); //myGui.txtArea.setCharacterAttributes(selectedText, false); if (onOffBold) { StyleConstants.setBold(myGui.attr, true); } //end if else { StyleConstants.setBold(myGui.attr, false); } //end else // myGui.txtArea.setCharacterAttributes(selectedText, false); } //end else if } //end try catch (IOException ioException) { JOptionPane.showMessageDialog(null, ioException, "ERROR", JOptionPane.WARNING_MESSAGE); } //end catch() } } //end class MyListener
- hana-hana3
- ベストアンサー率31% (4940/15541)
>今、ワードプロセッサを作っています。 テキストファイルには、文字の修飾情報はありません。 (保存できるのは、文字コードのみです) どのような仕様にするのかは貴方が決めて、その機能を実装すれば全て解決します。 修飾情報を保存したいのなら、独自フォーマットのファイルを作成して修飾情報等を一緒に保存してください。 (もしくは、rtf型式などで保存) http://ccfa.info/kakucyousi/qrst/r/rtf.html >タグを使うと簡単に出来ると言われたのですが ブラウザで表示させれば良いだけです。 「ワードプロセッサ」にはなりませんけど、HTML保存を標準にすれば、HTMLエディタにはなるかも知れませんが・・・。
お礼
お返事ありがとうございました。 RTFEditorKitを使うことによって解決できました。
お礼
私も、このサイトをみて問題解決しました。