Domanda

Sto cercando un metodo che calcoli il numero di riga di una determinata posizione del testo in un JTextPane con il wrapping abilitato.

Esempio:

  

Questa è una linea molto molto molto molto molto molto molto molto molto molto molto molto molto molto molto molto molto lunga.
  Questa è un'altra linea molto, molto, molto, molto, molto, molto, molto, molto, molto, molto, molto, molto lunga. |

Il cursore si trova sulla riga numero quattro, non due.

Qualcuno può fornirmi l'implementazione del metodo:

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

Soluzione

Prova questo

 /**
   * 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;
  }

Altri suggerimenti

http://java-sl.com/tip_row_column.html Un'alternativa che funziona con frammenti di testo formattati con stili diversi

potresti provare questo:

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

Tieni presente che i numeri di riga iniziano sempre da 0.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top