2012-10-25 87 views
3

我想在同一行對齊兩段文本:第一段應該對齊到左側,另一段應該對齊到Java swing的右側JTextPane 。我嘗試使用樣式界面和Styleconstants類來對齊文本,但它不起作用。但是,當我在同一文本上應用其他一些樣式,如Styleconstants.setFontSize(),Styleconstants.setForeGroundColor()時,它工作正常。Textalignment不能在java swing中工作jTextPane

這裏是我的代碼:

JTextPane pane = new JTextPane(); 
StyledDocument sdoc = pane.getStyledDocument(); 
SimpleAttributeSet rightAlign = new SimpleAttributeSet(); 
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT); 
StyleConstants.setForeground(rightAlign, Color.lightGray); 
StyleConstants.setFontSize(rightAlign, 11); 
sdoc.insertString(sdoc.getLength(), "name", null); 
sdoc.insertString(sdoc.getLength(), "timeHis" + "\n", rightAlign); 

它給像

nametimeHis

的輸出,但我想這樣

輸出命名                                                                                                           timeHis

(完全相反側的JTextPane在同一條線路)

這有什麼錯在我的代碼?我怎麼解決這個問題?

回答

3

我不認爲你可以設置兩個不同路線爲同一線(據我所知,你不能這樣做,即使在專業的文本編輯器 - 只是通過設置對齊)。我重寫了這樣的代碼:

SimpleAttributeSet rightAlign = new SimpleAttributeSet(); 
    SimpleAttributeSet leftAlign = new SimpleAttributeSet(); 

    StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT); 
    StyleConstants.setForeground(rightAlign, Color.lightGray); 
    StyleConstants.setFontSize(rightAlign, 11); 

    StyleConstants.setAlignment(leftAlign, StyleConstants.ALIGN_LEFT); 
    StyleConstants.setForeground(leftAlign, Color.black); 
    StyleConstants.setFontSize(leftAlign, 13); 

    String left = "name"; 
    String right = "timeHis\n"; 

    sdoc.insertString(0, left, leftAlign); 
    sdoc.insertString(left.length(), right, rightAlign); 

    sdoc.setParagraphAttributes(0, left.length(), leftAlign, false);    
    sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(), rightAlign, false);  

大小和顏色都可以,但兩個字符串的對齊方式都是正確的。如果在最後兩行這樣的交換比對:

sdoc.setParagraphAttributes(0, left.length(), rightAlign, false);    
    sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(),leftAlign, false); 

兩者都將被左對齊,但如果你在你的左邊字符串添加一個新行:

String left = "name\n"; 

取向也變得榮幸。 setParagraphAttributes方法完全按照它的說法 - 關鍵是對齊是paragraph屬性 - 打開OO Writer或MS Word(填充),編寫一些文本並對齊它 - 它會更清晰。

當我想在MS Word/OO Writer中實現這種對齊方式時,我製作了一個帶有不可見邊框的表格,並將左列設置爲左對齊,右列設置爲右對齊。 這將導致我們需要HTMLDocument(因爲您可以在HTML中製作table)類實現StyledDocument interface的結論。所以我試過這個:

JTextPane pane = new JTextPane(new HTMLDocument()); 

這樣會導致沒有樣式。這很有意義,因爲Cascading Style Sheets是HTML樣式的正確方法。這constructor解釋也:

public HTMLDocument(StyleSheet styles) 

這裏給StyleSheet構造函數參數的鏈接。

但是,這將這樣的伎倆:

JTextPane pane = new JTextPane(); 
pane.setEditorKit(new HTMLEditorKit()); 

EditorKit

建立一套文本組件是一個合理發揮編輯器功能所需的東西某種類型的文字內容。 EditorKit充當某種政策的工廠。例如,可以提供可以用其他實現替換的html和rtf的實現。

少數的EditorKit方法是:

  • createCaret()
  • getContentType()
  • read(Reader in, Document doc, int pos)
  • write(Writer out, Document doc, int pos, int len)

所以,基本上它是一個可編程的編輯(通過一讀第二寫一個text component文本內容方法),即Document

Document是文本的容器,其用作模型swing文本組件。此接口的目標是從非常簡單的需求(純文本文本字段)擴展到複雜需求(例如HTML或XML文檔)。

因此,HTMLEditorKit是一個文本組件的HTML文本內容,即HTMLDocument可編程編輯器 - 以這個類的繼承鏈的密切關注和實現接口 - 你會發現幾乎所有的他們在整個這個答案。

現在,這是神奇的部分從一個HTMLEditorKit apidoc:

雖然文件默認提供HTML支持,沒有受到什麼阻礙支持,導致替代元素結構非HTML標籤。

所以看起來這個類的默認實現翻譯我們style attributes到HTML/CSS只是我們希望他們的方式:左,在同一行右對齊。

這是有道理的,因爲與HTML/CSS,你可以以至少兩種方式做到這一點:

  • 製作一個兩列的表,並分別設置它們的路線
  • 做兩個浮動的div和設置他們的路線respectivley

並且最有可能有更多的方法來做到這一點。