Swing/GotoLine のバックアップの現在との差分(No.1)
TITLE:JTextAreaの任意の行まで移動
JTextAreaの任意の行に移動
編集者:Terai Atsuhiro~
作成日:2006-10-02
更新日:2022-07-14 (木) 10:41:58
概要
指定した行番号がJTextArea
の中で先頭にくるようにジャンプします。
Screenshot
Advertisement
概要
指定した行番号がJTextAreaの中で先頭にくるようにジャンプします。#screenshot
サンプルコード
#spanend
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);
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
JButton button = new JButton(new AbstractAction("Goto Line") {
#spanend
@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();
}
}
#spanadd
});
#spanend
#spanadd
EventQueue.invokeLater(() -> getRootPane().setDefaultButton(button));
#spanend
- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルでは、任意の行番号を指定してリターン、またはボタンをクリックすると、1から最大行数までの範囲で、その行が先頭にくるように表示位置が変更されます。解説
上記のサンプルでは、JTextField
に任意の行番号を指定してEnterキー、またはボタンをクリックするとその行がJViewport
の表示範囲の最上部に配置されるよう表示領域を更新します。
JTextArea#setCaretPosition(int)メソッドによるキャレットの位置変更だけでは、移動先を移動元より大きな行番号にした場合、JTextAreaの下までしかスクロールしないので、JTextArea#modelToView(int)メソッドで取得した座標が出来るだけ上部にくるように処理しています。
-
JTextArea#setCaretPosition(int)
メソッドによるCaret
の位置変更だけでは移動先を移動元より大きな行番号にしたときJTextArea
の下部までしかスクロールしない - そのため
Caret
の位置変更のまえにJTextArea#modelToView(int)
メソッドで取得した座標が可能なかぎり上部にくるようにJTextArea#scrollRectToVisible(...)
メソッドで表示位置を変更