2011-03-02 40 views
0

我正在嘗試確定文本區域中文本行的邊界。我知道我可以確定偏移量的邊界,這意味着我需要知道該行的開始和結束的偏移量。確定JTextArea行換行時的文本偏移量

所以我想我會嘗試使用getLine*方法,但它沒有給出我預期的結果。

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.text.DefaultHighlighter; 

public class TextAreaLineBoundsTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String string = "Lorem ipsum eum putant gubergren evertitur in, no assueverit vituperatoribus eum. Ea cibo offendit vim, est et vivendum qualisque prodesset. Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis, saperet salutandi forensibus ne usu. Ex fugit alterum usu. His ignota cotidieque in, augue erroribus eam no."; 
     JTextArea textArea = new JTextArea(string); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 

     String term = "qualisque"; 
     int termOffset = string.indexOf(term); 

     int termLine = textArea.getLineOfOffset(termOffset); 
     int termLineStartOffset = textArea.getLineStartOffset(termLine); 
     int termLineEndOffset = textArea.getLineEndOffset(termLine); 

     textArea.getHighlighter().addHighlight(termLineStartOffset, termLineEndOffset, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW)); 

     JScrollPane textAreaScroll = new JScrollPane(textArea); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new BorderLayout()); 
     frame.add(textAreaScroll, BorderLayout.CENTER); 
     frame.setSize(400, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

它突出顯示的是文本的整個段落,但我只想包含我正在搜索的術語的那一行。

回答

1
import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.DefaultHighlighter; 

public class TextAreaLine 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String string = "Lorem ipsum eum putant gubergren evertitur in, no assueverit vituperatoribus eum. Ea cibo offendit vim, est et vivendum qualisque prodesset. Vis doctus expetenda contentiones an, no ius mazim epicuri expetendis, saperet salutandi forensibus ne usu. Ex fugit alterum usu. His ignota cotidieque in, augue erroribus eam no."; 
     JTextArea textArea = new JTextArea(string); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     JScrollPane textAreaScroll = new JScrollPane(textArea); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new BorderLayout()); 
     frame.add(textAreaScroll, BorderLayout.CENTER); 
     frame.setSize(400, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     String term = "qualisque"; 
     int termOffset = string.indexOf(term); 
     Rectangle view = textArea.modelToView(termOffset); 
     int startOffset = textArea.viewToModel(new Point(0, view.y)); 
     int endOffset = textArea.viewToModel(new Point(textArea.getSize().width, view.y)); 
     textArea.getHighlighter().addHighlight(startOffset, endOffset, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW)); 
    } 
} 
+0

很對,我從來沒有想過這個伎倆。如果我想在上面和下面添加三條線,該怎麼辦? :) – Trejkaz 2011-03-02 04:04:22

+1

將Y變量的值更改爲行高的+/- 3倍。 getRowHeight()方法將返回此值。 – camickr 2011-03-02 06:10:50

+0

啊哈!我的IDE盡職盡責地將方法隱藏起來,因爲它受到保護。 :)我想知道他們爲什麼這麼做。哦,對於這種特殊情況,我正在構建組件,所以我可以通過子類來公開它。 – Trejkaz 2011-03-03 04:36:51