私はJavaチャットアプリケーションを作っています。私はすでに基本を作っており、うまく機能しています。ここで、フォントを変更してスマイリーを挿入する機能を追加したいと考えました。また、各メッセージの横にタイム スタンプを少し追加したいと思いました。
タイムスタンプについては、適切な配置のためにテーブルを使用する必要があることは明らかです。しかし、それらを持つための簡単な解決策を見つけることができませんでした. 少しググった後、
- HTMLで実現できることを知りました。そこで、HTML エディター キットを試してみましたが、かなりうまくいきました。スマイリー、フォント、時間が挿入されました。
- ただし、そのチャットの会話をファイルに保存する必要もあります (チャット履歴用)。このすべての背後にドキュメントがあることを知っています。そのメソッドを使用して保存/読み込みを試みましたが、いくつか問題がありました。コードは以下です。
- さらに、フォント サイズが問題です。範囲が 1 ~ 7 であるため、MS Word のように通常の範囲が必要です。
- 最後に、私の HTML の知識は非常に基本的なものであり、最近では何も知らない CCS で HTML が使用されています。ほとんどの Web サイトでは HTML タグの使用を推奨していません。最新バージョンでは HTML タグがサポートされていないからです。それは私のアプリケーションに問題を引き起こしますか? もしそうなら、私は上記を達成するための別の方法を望んでいます.これは単純な大学のプロジェクトであっても、非推奨のものを使用したくありません.
コード: これらの一般変数を作成しました:
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument HTMLdoc = new HTMLDocument();
jTextPane1.setEditorKit(kit);
jTextPane1.setDocument(HTMLdoc);
JButton には、テキスト/チャットを挿入する次のコードがあります。
kit.insertHTML(HTMLdoc, HTMLdoc.getLength(), "<tr>"
+ "<td width=\"50\" valign=\"top\">NAME:</td>"
+ "<td width=\"250\"><font size=\"3\" face=\"Monospaced\">" + addSmiles(JOptionPane.showInputDialog(null)) + "</font></td>"
+ "<td width=\"100\" valign=\"top\"><font size=\"1\">"
+ new SimpleDateFormat("hh:mm a").format(Calendar.getInstance().getTime()).toString() + "</font></td>"
+ "</tr>", 0, 0, null);
addSmiles メソッドは各単語を処理し、':)' を img タグに置き換えます。
会話を保存/再読み込みするために、次の基本的なコードを使用しました。
kit.read(new FileReader("asd.htm"), HTMLdoc, 0);
kit.write(new FileWriter("asd.htm"), HTMLdoc, 0, HTMLdoc.getLength());
書き込みは問題ありませんが、読み取りでエラーが発生します。
java.lang.RuntimeException: Must insert new content into body element
insertHTML メソッドの使い方が間違っているように感じます。誰かがその使用法を示す素敵なリンクを教えてくれませんか? 特に最後の 3 つの引数 (pop & pushDepth、insertTag) と例を示します。オラクルのドキュメント、私の満足のいくように説明しないでください。:/
- 複数のフォントをサポートするために、SimpleAttributeSet で標準の StyledDocuemnt を使用しました。RTFEditorKit を使用し、チャットを正常に保存/ロードしました。しかし、スマイリーやタイムスタンプのテーブルを挿入できませんでした。ここで 1 つのリンクに出くわしました。JTextPane にテーブルを描画しようとします。わかりにくいと思いますが、皆さんの推薦があれば真剣に検討します。
私の問題をきちんと説明し、長すぎないようにしたいと思います! :D あなたの答えを楽しみにしています。
- - - - -編集 : - - - - -
コードを少し変更しました。
初期化:
HTMLEditorKit kit = new HTMLEditorKit();
jTextPane1.setEditorKit(kit);
HTMLDocument HTMLdoc = (HTMLDocument) jTextPane1.getDocument();
HTMLdoc.putProperty("IgnoreCharsetDirective", true);
適切な try-catch を使用して、最初の行をドキュメントに挿入します。
kit.insertHTML(HTMLdoc, 0, "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">", 0, 0, null);
kit.insertHTML(HTMLdoc, HTMLdoc.getLength(), "<table id=\"TBL\"></table>", 0, 0, null);
どのチャットでも、以前と同じ HTML 文字列を使用しますが、挿入に使用する方法を変更しただけです。
HTMLdoc.insertBeforeEnd(HTMLdoc.getElement("TBL"), "<tr>"
+ "<td width=\"50\" valign=\"top\">NAME:</td>"
+ "<td width=\"250\"><font size=\"3\" face=\"Monospaced\">" + addSmiles(JOptionPane.showInputDialog(null)) + "</font></td>"
+ "<td width=\"100\" valign=\"top\">" + new SimpleDateFormat("hh:mm a").format(Calendar.getInstance().getTime()).toString() + "</td>"
+ "</tr>");
最後に、チャットを保存するには:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("asd"), "UTF-8");
kit.write(out, HTMLdoc, 0, HTMLdoc.getLength());
out.close();
この時点まで、すべてが美しく機能します。ファイル「asd」を開くと、HTML が正しく表示されます。ブラウザで開いてデータを正しく表示することもできます。
データを取得して JTextPane/Document に挿入するには:
InputStreamReader in = new InputStreamReader(new FileInputStream("asd"), "UTF-8");
kit.read(in, HTMLdoc, 0);
in.close();
この場合、エラーが発生します。
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Must insert new content into body element-
at javax.swing.text.html.HTMLDocument$HTMLReader.generateEndsSpecsForMidInsert(HTMLDocument.java:2353)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2300)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2174)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2169)
at javax.swing.text.html.HTMLDocument.getReader(HTMLDocument.java:326)
at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:260)
at ChatGUI.NewJFrame.jBtnRWActionPerformed(NewJFrame.java:157)
157 行目は kit.read ステートメントを指しています。ここで私が間違っていることを誰かに教えてもらえますか?
もう一度編集------------------------
私は自分の間違いに気づきました:)。ドキュメントを読み込む前にドキュメントをクリアする必要がありました:
HTMLdoc.remove(0, HTMLdoc.getLength());
今では動作します!!