Метод, который возвращает номер строки для данной позиции JTextPane?

Я ищу метод, который вычисляет номер строки заданной текстовой позиции в JTextPane с включенным переносом.

Пример:

Это очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень длинная очередь.
Это еще одна очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень очень длинная очередь.|

Курсор находится на строке номер четыре, а не на второй.

Может ли кто-нибудь предоставить мне реализацию метода:

int getLineNumber(JTextPane pane, int pos)
{
     return ???
}

person Marlo Guthrie    schedule 19.09.2008    source источник


Ответы (3)


Попробуй это

 /**
   * Return an int containing the wrapped line index at the given position
   * @param component JTextPane
   * @param int pos
   * @return int
   */
  public int getLineNumber(JTextPane component, int pos) 
  {
    int posLine;
    int y = 0;

    try
    {
      Rectangle caretCoords = component.modelToView(pos);
      y = (int) caretCoords.getY();
    }
    catch (BadLocationException ex)
    {
    }

    int lineHeight = component.getFontMetrics(component.getFont()).getHeight();
    posLine = (y / lineHeight) + 1;
    return posLine;
  }
person Richard    schedule 19.09.2008
comment
класс jtextpane способен поддерживать переменные размеры шрифта, этот метод НЕ будет работать в этом сценарии. - person GlassGhost; 18.03.2011

http://java-sl.com/tip_row_column.html Альтернатива, которая работает с текстовыми фрагментами, отформатированными с разными стилями

person StanislavL    schedule 31.10.2010

вы можете попробовать это:

public int getLineNumberAt(JTextPane pane, int pos) {
    return pane.getDocument().getDefaultRootElement().getElementIndex(pos);
}

Имейте в виду, что номера строк всегда начинаются с 0.

person Morgan    schedule 01.01.2017