如何在Java中使textArea的特定行可见

时间:2011-04-17 00:18:12

标签: java jtextarea scrollpane

我的JTextArea包含数千行,但并非所有行都是可见的。我想以编程方式滚动到textArea的特定行,以便该行可见。我发现scrollPane有一个方法scrollRectToVisible,但我没有成功。任何人都可以建议我如何实现目标。一个可行的代码片段对我来说真的很有帮助。谢谢。

2 个答案:

答案 0 :(得分:3)

scrollRectToVisible(...)应该可以工作。确保在文本区域而不是滚动窗格上调用scrollRectToVisible(...)。如果这不起作用,那么我猜你没有得到正确的矩形滚动到。发布展示问题的SSCCE

另一种方法是使用Text Utilities的gotoStartOfLine(...)方法。如果您愿意,也可以使用centerLineInScrollPane(...)方法。

答案 1 :(得分:1)

我猜你已经回答了这个问题。我在这段时间里创建了我的SSCCE,所以如果不是你的话,我会发布给别人的利益。

import java.awt.BorderLayout;
import java.awt.Rectangle;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;

public class TestScrollRectToVisible extends JPanel {
   private static final int MAX_LOOP = 10000;
   private DefaultListModel listModel = new DefaultListModel();
   private JTextArea textarea = new JTextArea(20, 30);
   private JList jList = new JList(listModel);
   JScrollPane textareaScrollPane = new JScrollPane(textarea);


   public TestScrollRectToVisible() {
      jList.addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
               String text = jList.getSelectedValue().toString();
               text += ": ";

               String docText = textarea.getText();
               int index = docText.indexOf(text);
               if (index < 0) {
                  return;
               }
               try {
                  Rectangle rect = textarea.modelToView(index);
                  textarea.scrollRectToVisible(rect);
               } catch (BadLocationException e1) {
                  e1.printStackTrace();
               }
            }
         }
      });

      jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      StringBuilder strBuilder = new StringBuilder();
      for (int i = 0; i < MAX_LOOP; i++) {
         String text = String.valueOf(i);
         listModel.addElement(text);
         strBuilder.append(text + ": abcdefghijklmnopqrstuvwxyz" + "\n");
      }
      textarea.setText(strBuilder.toString());

      setLayout(new BorderLayout());
      add(textareaScrollPane, BorderLayout.CENTER);
      add(new JScrollPane(jList), BorderLayout.EAST);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("TestScrollRectToVisible");
      frame.getContentPane().add(new TestScrollRectToVisible());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}