2011-04-04 63 views
0

我們有一個繪製文本的應用程序,但隨後顯示一個JTextArea供用戶在點擊文本時編輯文本。但是,這兩個文本處理組件之間的包裝不同。它們使用相同的寬度,文本字符串和字體。爲什麼JTextArea和TextLayout以不同的方式包裝單詞?

對於文本繪圖,我使用的是Java教程,我也在其他論壇上看到過其他人在相關問題中使用過的Java教程。下面的代碼的一部分:

FontRenderContext frc = g2d.getFontRenderContext(); 
TextLayout layout; 
AttributedString attrString = new AttributedString(myText); 
AttributedCharacterIterator charIterator; 
int paragraphStart; 
int paragraphEnd; 
LineBreakMeasurer lineMeasurer; 
float breakWidth; 
float drawPosX; 
float drawPosY; 

attrString.addAttribute(TextAttribute.FONT, myFont); 
charIterator = attrString.getIterator(); 
paragraphStart = charIterator.getBeginIndex(); 
paragraphEnd = charIterator.getEndIndex(); 
lineMeasurer = new LineBreakMeasurer(charIterator, frc); 

// Set break width to width of Component. 
breakWidth = myTextWidth; 
drawPosY = startY 
// Set position to the index of the first character in the paragraph. 
lineMeasurer.setPosition(paragraphStart); 
textBounds = new Rectangle(startX, startY(), 0, 0); 

// Get lines from until the entire paragraph has been displayed. 
while (lineMeasurer.getPosition() < paragraphEnd) { 

    layout = lineMeasurer.nextLayout(breakWidth); 

    // Compute pen x position. If the paragraph is right-to-left we 
    // will align the TextLayouts to the right edge of the panel. 
    drawPosX = layout.isLeftToRight() 
        ? startX() : breakWidth - layout.getAdvance(); 

    // Draw the TextLayout at (drawPosX, drawPosY). 
    layout.draw(g2d, drawPosX, drawPosY); 
    lineBounds = new Rectangle2D.Float(drawPosX, drawPosY - layout.getAscent(), layout.getAdvance(), (layout.getAscent() + layout.getDescent() + layout.getLeading())); 

    // Move y-coordinate in preparation for next layout. 
    drawPosY += layout.getAscent() + layout.getDescent() + layout.getLeading(); 
} 

的JTextArea是簡單得多:

JTextArea textArea = new JTextArea(myText); 
textArea.setSize(myTextWidth, myTextThing.getHeight()); 
textArea.setOpaque(true); 
textArea.setVisible(true); 
textArea.setLineWrap(true); 
textArea.setWrapStyleWord(true); 
textArea.setFont(myFont); 
textArea.setBorder(null); 

我設置邊框爲空,因爲我有文本區域的邊界之外繪製的虛線區域另一個矩形以顯示它在哪裏。可能現在看起來很愚蠢,但我們用它來顯示文本區域的邊界,當用戶第一次選擇他們想要編輯的文本時。此時,JTextArea尚未創建。他們必須再次點擊才能開始編輯。原因是一旦選擇了文本區域,它們也可能拖動文本區域並調整其大小,並且如果它們在開始拖動和調整大小時具有生動的JTextArea,則會變得混亂和更混亂。

另外,繪製的TextLayouts和JTextArea都看起來很好地包裝單詞。但是當一起使用時,你可以看到差異。問題在於,當用戶正在編輯文本時,JTextArea正在做它的事情來包裝文本。但是,當用戶JTextArea失去焦點時,會將其轉換爲繪製的文本,然後可能會用不同的方式包裝這些文字。

+0

感謝您的回覆。我編寫了一個SSCCE,當它最終完成時,JTextArea和TextLayout將文本包裝成相同的文本。這導致我再次看看原始代碼,並在這樣做的過程中發現了JTextArea上setSize()和setBounds()的不必要用法。一旦我清理它,它工作得很好。 – user26270 2011-04-05 18:39:23

回答

0

il字符填充文本區域。抓住用戶界面標尺或放大鏡,並從最長行最左邊的字符到最右邊的像素,計算文本區域的大小。對n,m以及其他幾個字符進行相同的處理以獲得更多的數據點。我懷疑,即使設置爲無邊框,文本區域也會使用幾個像素的不可見邊框。如果是這種情況,在TextLayout組件周圍添加相同的邊框,它們應該看起來相同。

(除了計算像素,您可以爲文本或組件設置背景顏色,但我不一定會相信它。)

相關問題