1

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

4

2 回答 2

3

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

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

于 2011-04-17T00:25:40.850 回答
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();
         }
      });
   }
}
于 2011-04-17T00:57:16.087 回答