- 締切済み
StyledDocumentの背景色の不具合
標記の件、JTextPaneにDefaultStyledDocumentを設定して、テキスト編集環境を 構築していますが、デフォルトでのフォントの背景色が正しく取得できません。 フォントのデフォルトの背景色は見た目には白なのですが、 取得される背景色は黒(r=0,g=0,b=0,a=255)になってしまっています。 背景色を適当に設定すると、その部分の色は正しく反映されます。 マニュアルで背景色を黒く設定しているのか、無設定で背景色が黒として取得されて いるのかの判別方法がなく困っております。 以下、サンプルコードを示します。 対処法をご存知の方がおられましたら、よろしくお願いいたします。 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import javax.swing.text.StyledDocument; public class StyledDocumentText { public static void main(String[] args) { final StyledDocument document = new DefaultStyledDocument(new StyleContext()); JTextPane textPane = new JTextPane(document); textPane.addCaretListener( new CaretListener(){ public void caretUpdate(CaretEvent e) { // キャレット位置の背景色を取得し、コンソール出力 AttributeSet a = document.getCharacterElement(e.getDot()).getAttributes(); Color background = StyleConstants.getBackground(a); System.out.printf( " %s a=%d\n", background ,background.getAlpha() ); } } ); // テキスト挿入 try { document.insertString(0, "abcdefg", null); } catch (BadLocationException e) { e.printStackTrace(); } // マニュアルで背景色を設定 MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setBackground(attr, new Color(255,100,50,230) ); document.setCharacterAttributes( 2, 3, attr, false); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add( textPane ); frame.setSize( 300, 300 ); frame.setVisible( true ); } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- _ranco_
- ベストアンサー率58% (126/214)
> ドキュメント中に画像が埋め込まれている場合の保存方法で悩んでいます。 いろいろ調べてみましたが、「自分の独自の保存方法でやる」が結論のようです。つまり、ワープロソフトを独自開発した場合を考えると、それは納得できますね。XmlEncoder/DecoderもSerializableも、だめですね。
- _ranco_
- ベストアンサー率58% (126/214)
> フォントのデフォルトの背景色は見た目には白なのですが、 この白は、フォントの背景色ではないのでは?(無指定だから) 一度、明示的にsetBackground()してみたらどうでしょう。
補足
その後の検討の結果、StyledDocument#setLogicalStyle()を使って、 StyledDocumentの初期設定が可能であることがわかりました。 なぜLogicalStyleなどという意味不明な名前なんでしょう。 私の調べたところ、WEB上にはこれに関する情報が全く見つからなかったので、 一応、初期化に関するサンプルコードを掲載しておきます。 StyleContext styleContext = new StyleContext(); StyledDocument document = new DefaultStyledDocument(styleContext); JTextPane textPane = new JTextPane(document); Style systemDefault = styleContext.getStyle(StyleContext.DEFAULT_STYLE); Style userDefault = styleContext.addStyle("userDefault", systemDefault); StyleConstants.setFontSize( userDefault, 15 ); // ex. StyleConstants.setFontFamily( userDefault, "Serif" ); // ex. StyleConstants.setBackground( userDefault, Color.WHITE ); // ex. document.setLogicalStyle( 0, styleContext.getStyle("userDefault") ); この情報は、Javaの公式デモサンプルコードの中で見つけました。 まさか、そのデモコードを読んで意味があろうとは...! 次は、ドキュメント中に画像が埋め込まれている場合の保存方法で悩んでいます。 画像がなければ、XMLEncoder/Decoderで、Read/Writeできるところまでは 辿り着いたのですが、画像がある場合の常套手段はないのでしょうか? テキスト,フォント,スタイル情報はXMLで保存して、画像は位置情報とともに 独自にEncodee/Decoderを実装するしかないんでしょうか? RTFEncoder,HTMLEncoderでも画像情報が保存されないんですね?