2011-08-01 3 views
0

について私が書いてきたアプリケーションにJTextPaneの(または1つの私のサブ分類バージョン)を使用してきた、と私はスタイルに取り組んできました。私のプログラムは、私が望むやり方ではなく、AttributeSet.containsAttributes(AttributeSet属性)メソッドのバグと思われる振る舞いを追跡しました。Javaでバグが見つかりましたか?属性セット

import javax.swing.JTextPane; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.Style; 

public class StyleBug { 
    public static void main(String[] args) { 

     JTextPane textPane = new JTextPane(); 
     textPane.setText("This is a test string"); 

     Style bold = textPane.addStyle(BOLD, null); 
     StyleConstants.setBold(bold, true); 

     Style italic = textPane.addStyle(ITALIC, null); 
     StyleConstants.setItalic(italic, true); 

     int start = 5; 
     int end = 10; 

     textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(BOLD), false); 
     textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(ITALIC), false); 

     for(int i = start; i < end; i++) 
      System.out.println(textPane.getStyledDocument().getCharacterElement(i).getAttributes() 
      .containsAttributes(textPane.getStyle(BOLD))); //all print false 
    } 

    private static final String BOLD = "Bold"; 
    private static final String ITALIC = "Italic"; 
} 

これはバグですか、それとも何か不足していますか?

+0

静的な初期化について言及していますか? – Mikaveli

+0

textPane.getStyle(BOLD)とtextPane.getStyle(ITALIC)、 –

+0

@Mikaveli、私が言及しているバグは、Bold属性のスタイルを適用したにもかかわらず、containsAttributesメソッドはテキストが太字ではないことを示しています。 – Mark

答えて

4

私は、この行をコメントアウトした場合:

// textPane.getStyledDocument().setCharacterAttributes(start, end - start, textPane.getStyle(ITALIC), false); 

そして、それはすべての要素に対して真出力します。 setCharacterAttributesのJavadocによると、それはあなたが渡しているスタイルから属性のすべてを使用していますので、あなたは、単にITALIC選択とBOLD選択をオーバーライドしています。

EDIT:

私は、デバッガを引き上げ、getCharacterElement(5)の属性のこの配列を得ました。

[0] javax.swing.text.StyleConstants$FontConstants "italic" 
[1] java.lang.Boolean "true" 
[2] javax.swing.text.StyleConstants "name" 
[3] java.lang.String "Italic" 
[4] javax.swing.text.StyleConstants$FontConstants "bold" 
[5] java.lang.Boolean "true" 

あなたが見ることができるように、属性は2 italicのグループに順序付けさがtrueに設定されている、boldがtrueに設定され、かつname"Italic"に設定されています。これは、文字の名前付き属性セットに1つの名前しか使用できないことを意味します。名前のない属性は正しくマージされているので、特定の名前付き属性が文字に適用されているかどうかを確認できない場合でも、行動的に望ましいものであることに注意してください。

+1

これで私を助けてくれてありがとう。 はい、私はそれにも気付きました。しかし、斜体属性を追加したときに大胆な属性を維持することを期待しました。 setCharacterAttributesで使用する4番目のパラメータは、新しい属性が古い属性を上書きするかどうか、または古い属性を上書きするかどうかを判断することです。 Javadocから: boolean - 新しい属性が設定される前に以前の属性を消去する必要があるかどうかを示します。 trueの場合、操作は以前の属性を完全に置き換えます。 falseの場合、新しい属性は以前の属性とマージされます。 – Mark

+0

(申し訳ありませんが、これは私の初めての投稿です) – Mark

+0

@マーク私はあなたがそれを指摘したので私の答えを編集しました。 Stylesをマージする場合は、スタイルの名前に頼ることができないように見えます(意味があります)。 – Bringer128

2

Bringer128は、上記の問題を見つけましたが、私はちょうどもう少し明確ます。

スタイルをJTextPaneの、引数が実際に属性としてスタイルに配置されるように渡される文字列に追加された場合には(驚くべきことではないが、NameAttribute)。 Styleが文字の範囲に適用されると、Styleに設定されている他のAttributesとともにNameAttributeが適用されます。だから、私のBOLDスタイルが適用されたとき、その範囲内のすべての文字はBoldAttributeがtrueに設定され、NameAttributeがBoldに設定されていました。次に、私のITALICスタイルが適用されたとき、すべての文字はItalicAttributeがtrueに設定され、NameAttributeが「Italic」に設定されていました。私のBOLDスタイルのすべての属性は、それらの文字に適用された場合containsAttributes()がチェックされている場合、そのNameAttributesは「斜体」に「太字」から変更されていたので、次に、それはfalseを返されました。誰もがそれを混乱させないことを願っています。ここで

は私の仕事は(私はそれが元のコードよりも、実際に簡単だと思う)程度です。その要点は、StylesまたはJTextPane.addStyle()を全く使用しないことです。私はただ定数MutableAttributeSetsを保持します。

import javax.swing.JTextPane; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.MutableAttributeSet; 
import javax.swing.text.SimpleAttributeSet; 

public class StyleBugFix { 
    public static void main(String[] args) { 

     JTextPane textPane = new JTextPane(); 
     textPane.setText("This is a test string"); 

     StyleConstants.setBold(BOLD, true); 

     StyleConstants.setItalic(ITALIC, true); 

     int start = 5; 
     int end = 10; 

     textPane.getStyledDocument().setCharacterAttributes(start, end - start, BOLD, false); 
     textPane.getStyledDocument().setCharacterAttributes(start, end - start, ITALIC, false); 
     for(int i = start; i < end; i++) 
      System.out.println(textPane.getStyledDocument().getCharacterElement(i).getAttributes() 
       .containsAttributes(BOLD)); //all now print true 
    } 

    private static final MutableAttributeSet BOLD = new SimpleAttributeSet(); 
    private static final MutableAttributeSet ITALIC = new SimpleAttributeSet(); 
} 

もう一度Bringer128に感謝します。

+0

+1最終回答を回答として投稿します。これは、これに繋がる誰かを助けるはずです。 – Bringer128

関連する問題