Как сделать конкретную строку видимой из textArea в Java - PullRequest
1 голос
/ 17 апреля 2011

Моя JTextArea содержит тысячи строк, но не все из них видны одновременно. Я хочу программно прокрутить до определенной строки textArea, чтобы строка была видимой. Я обнаружил, что у scrollPane есть метод scrollRectToVisible, но мне это не удалось. Может ли кто-нибудь подсказать мне, как достичь цели. Работоспособный фрагмент кода будет очень полезным для меня. Благодарю.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2011

scrollRectToVisible (...) должен работать.Убедитесь, что вы вызываете scrollRectToVisible (...) в текстовой области, а не в области прокрутки.Если это не сработает, то, я думаю, вы не получите нужный прямоугольник для прокрутки.Отправьте SSCCE , который демонстрирует проблему.

Другой подход заключается в использовании метода gotoStartOfLine (...) Текстовые утилиты .Вы также можете использовать метод centerLineInScrollPane (...), если хотите.

1 голос
/ 17 апреля 2011

Я думаю, вы уже ответили на это.В это время я создавал свой 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();
         }
      });
   }
}
...