概要

指定した行番号がJTextAreaの中で先頭にくるようにジャンプします。

サンプルコード

JButton button = new JButton(new AbstractAction("Goto Line") {
  @Override public void actionPerformed(ActionEvent e) {
    Document doc = textArea.getDocument();
    Element root = doc.getDefaultRootElement();
    int i = Integer.parseInt(textField.getText().trim());
    i = Math.max(1, Math.min(root.getElementCount(), i));
    try {
      Element elem = root.getElement(i - 1);
      Rectangle rect = textArea.modelToView(elem.getStartOffset());
      Rectangle vr = scroll.getViewport().getViewRect();
      rect.setSize(10, vr.height);
      textArea.scrollRectToVisible(rect);
      textArea.setCaretPosition(elem.getStartOffset());
    } catch (BadLocationException ex) {
      Toolkit.getDefaultToolkit().beep();
    }
  }
});
EventQueue.invokeLater(() -> getRootPane().setDefaultButton(button));
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextFieldに任意の行番号を指定してEnterキー、またはボタンをクリックするとその行がJViewportの表示範囲の最上部に配置されるよう表示領域を更新します。

  • JTextArea#setCaretPosition(int)メソッドによるCaretの位置変更だけでは移動先を移動元より大きな行番号にしたときJTextAreaの下部までしかスクロールしない
  • そのためCaretの位置変更のまえにJTextArea#modelToView(int)メソッドで取得した座標が可能なかぎり上部にくるようにJTextArea#scrollRectToVisible(...)メソッドで表示位置を変更

参考リンク

コメント