2013-03-24 59 views
1

我有一個JTextPane,我想添加行並根據它們的內容讓它們具有不同的格式。JTextPane格式

目前我有這個

StyleContext context = new StyleContext(); 
StyledDocument document = new DefaultStyledDocument(context); 

Style styleBold = context.getStyle(StyleContext.DEFAULT_STYLE); 
StyleConstants.setBold(styleBold, true); 
StyleConstants.setFontSize(styleBold, 18); 

Style styleNorm = context.getStyle(StyleContext.DEFAULT_STYLE); 
StyleConstants.setFontSize(styleNorm, 15); 

for (int i = 0; i < temp.size(); i++) { 
    String tmp = temp.get(i); 
    if (tmp.substring(0, 2).equals(COMMENT_PREFIX)) { 
     String addThis = " - " + tmp.substring(2); 

     try { 
      document.insertString(document.getLength(), addThis, 
        styleNorm); 
     } //CATCH 
    } else if (tmp.substring(0, 2).equals(VERSION_PREFIX)) { 
     Date d = new Date(System.currentTimeMillis()); 
     String addThis = "Version: " + tmp.substring(2) + " - " 
       + d.toString(); 
     try { 
      document.insertString(document.getLength(), addThis, 
        styleBold); 
     } //CATCH 
    } 
    try { 
     document.insertString(document.getLength(), "\n", styleNorm); 
    } //CATCH 
} 

我拿出catch語句以減少代碼量。

但是,這會將我的整個文本格式設置爲styleNorm。這是因爲它是最後一次叫Style,它們覆蓋了彼此?如果是這樣,我該如何解決這個問題?

+0

Textpane是一個痛苦,但你需要一個格式化。 – 2013-03-24 15:17:50

+0

請編輯您的問題以包含專注於單個問題的[sscce](http://sscce.org/)。 – trashgod 2013-03-24 16:03:58

回答

9

也看到here,TextComponentDemo顯示瞭如何應用StyleConstants的數字,包括字體大小,樣式,對齊方式和顏色。樣式可以直接應用於Document,如initAttributes()所示,或者通過StyledEditorKit的行爲應用,見here

附錄:下面的示例使用SimpleAttributeSet創建三個相關樣式。請注意,highAlert會改變顏色,但會保留從boldBlue繼承的黑體屬性。

image

import java.awt.Color; 
import java.awt.EventQueue; 
import java.util.Date; 
import javax.swing.JFrame; 
import javax.swing.JTextPane; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyledDocument; 

/** 
* @see https://stackoverflow.com/a/15600689/230513 
*/ 
public class Test { 

    private void display() throws BadLocationException { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     String s = new Date().toString(); 
     JTextPane jtp = new JTextPane(); 
     StyledDocument doc = (StyledDocument) jtp.getDocument(); 

     SimpleAttributeSet normal = new SimpleAttributeSet(); 
     StyleConstants.setFontFamily(normal, "SansSerif"); 
     StyleConstants.setFontSize(normal, 16); 

     SimpleAttributeSet boldBlue = new SimpleAttributeSet(normal); 
     StyleConstants.setBold(boldBlue, true); 
     StyleConstants.setForeground(boldBlue, Color.blue); 

     SimpleAttributeSet highAlert = new SimpleAttributeSet(boldBlue); 
     StyleConstants.setFontSize(highAlert, 18); 
     StyleConstants.setItalic(highAlert, true); 
     StyleConstants.setForeground(highAlert, Color.red); 

     doc.insertString(doc.getLength(), s + "\n", normal); 
     doc.insertString(doc.getLength(), s + "\n", boldBlue); 
     doc.insertString(doc.getLength(), s + "\n", highAlert); 
     f.add(jtp); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        new Test().display(); 
       } catch (BadLocationException ex) { 
        ex.printStackTrace(System.err); 
       } 
      } 
     }); 
    } 
} 
+1

+1你真的是一個搖擺英雄。恭喜超過10萬名代表。 – 2013-03-25 16:47:22

+0

我們如何組合** bold **和** italic **。你的例子主要分別顯示粗體和斜體。我需要爲相同的文本打印粗體和斜體。 – 2013-11-25 06:28:12

+1

@ chinna_82 - 爲SimpleAttributeSet(例如「sas」)設置粗體和斜體,您只需調用'StyleConstants.setBold(sas,true)'和'StyleConstants.setItalic(sas,true)'。 – marklark 2017-10-26 18:43:42