TITLE:JTextAreaの任意の行まで移動

JTextAreaの任意の行に移動

編集者:Terai Atsuhiro
作成日:2006-10-02
更新日:2022-07-14 (木) 10:41:58

概要

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

#screenshot

サンプルコード

 JButton button = new JButton(new AbstractAction("Goto Line") {
   public void actionPerformed(ActionEvent e) {
     Document doc = textArea.getDocument();
     Element root = doc.getDefaultRootElement();
     int i = 1;
     try{
       i = Integer.parseInt(textField.getText().trim());
       i = Math.max(1, Math.min(root.getElementCount(), i));
     }catch(NumberFormatException nfe) {
       java.awt.Toolkit.getDefaultToolkit().beep();
       return;
     }
     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());
       //textArea.requestFocus();
     }catch(BadLocationException ble) {
       java.awt.Toolkit.getDefaultToolkit().beep();
     }
   }
 });
 frame.getRootPane().setDefaultButton(button);
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、任意の行番号を指定してリターン、またはボタンをクリックすると、1から最大行数までの範囲で、その行が先頭にくるように表示位置が変更されます。

JTextArea#setCaretPosition(int)メソッドによるキャレットの位置変更だけでは、移動先を移動元より大きな行番号にした場合、JTextAreaの下までしかスクロールしないので、JTextArea#modelToView(int)メソッドで取得した座標が出来るだけ上部にくるように処理しています。

コメント