2009-07-24 8 views
6

Attualmente sto cercando di risolvere un problema in cui ho bisogno di trovare la posizione in un pezzo di testo in un JEditorPane in base a dove era il mouse cliccato.Come convertire da una posizione del mouse a una posizione di carattere in un JEditorPane in Java Swing

Fondamentalmente, quando l'utente fa clic con il pulsante destro del mouse su una parola, devo scoprire qual è la parola. Per fare questo ho bisogno di scoprire in quale posizione nel testo l'utente ha cliccato. So che posso facilmente ottenere la posizione del mouse da MouseEvent che viene passato al metodo mousePressed, e mi è stato detto che è possibile convertirlo per ottenere l'indice dei caratteri nella parte di testo - tuttavia non riesco a capire come fare Questo.

Ho provato il metodo viewToModel() su JEditorPane, tuttavia questo mi sta restituendo la posizione sbagliata nel testo, quindi o sto usando male o non funziona in questo modo.

Qualche idea?

risposta

9

Invocare viewToModel() è il modo corretto di fare questo:

public void mouseClicked(MouseEvent e) { 
    JEditorPane editor = (JEditorPane) e.getSource(); 
    Point pt = new Point(e.getX(), e.getY()); 
    int pos = editor.viewToModel(pt); 
    // whatever you need to do here 
} 
+0

Grazie, ho impostato la tua risposta come accettata, come vedrai dalla mia risposta qui sotto è quasi esattamente quello che ho fatto. – Scottm

+0

@ ChssPly76 Può essere usato in qualche modo per un JTable? – Igor

+0

Il metodo viewToModel() è già fornito dalla classe più generale JTextComponent. Per un JTable ci sono altri metodi che dovrebbero prima restituire la cella, e quindi si dovrebbe chiamare un metodo appropriato a seconda del renderer/editor di celle. –

0

Ho risolto questo problema da solo. Si scopre che viewToModel() è esattamente quello che dovrei usare qui, il problema era che stavo passando nel punto sbagliato ad esso.

Da MouseEvent, stavo usando il metodo getLocationOnScreen() per calcolare il punto in cui avrei dovuto usare il metodo getPoint().

Grazie a tutti coloro che hanno letto questa domanda.