2010-12-30 3 views

Répondre

0

Vous devrez peut-être utiliser la classe FontMetrics.
Analysez le texte, déterminez les nouvelles lignes/enveloppes du texte. puis utilisez

Font font = new Font("Verdana", Font.PLAIN, 10); 
    FontMetrics metrics = new FontMetrics(font); 
    Rectangle2D bounds = metrics.getStringBounds("string", null); 
    int widthInPixels = (int) bounds.getWidth(); 

etc ....

Et si vous voulez vraiment, publier votre solution ici pour être cool. :)

3

TextUI ont méthode modelToView qui va vous donner des positions/taille du caret:

import java.awt.BorderLayout; 
import java.awt.Rectangle; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.event.CaretEvent; 
import javax.swing.event.CaretListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.JTextComponent; 


public class PixelPositionOfCaretDemo 
{ 
    public PixelPositionOfCaretDemo() 
    { 
     JLabel label = new JLabel("Move the caret..."); 
     JTextArea area = new JTextArea(); 
     area.addCaretListener(new MyCaretListener(label)); 

     JFrame frame = new JFrame(); 
     frame.setLayout(new BorderLayout()); 
     frame.setBounds(new Rectangle(400, 400, 400, 400)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(area, BorderLayout.CENTER); 
     frame.add(label, BorderLayout.SOUTH); 
     frame.setVisible(true); 
    } 

    private static class MyCaretListener implements CaretListener 
    { 
     private final JLabel label; 

     MyCaretListener(JLabel label) 
     { 
      this.label = label; 
     } 

     @Override 
     public void caretUpdate(CaretEvent e) 
     { 
      JTextComponent textComp = (JTextComponent) e.getSource(); 
      try 
      { 
       Rectangle rect = textComp.getUI().modelToView(textComp, e.getDot()); 
       label.setText(rect.toString()); 
      } 
      catch (BadLocationException ex) 
      { 
       throw new RuntimeException("Failed to get pixel position of caret", ex); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new PixelPositionOfCaretDemo(); 
      } 
     }); 
    } 
} 
+1

+1 , Vous n'avez pas besoin d'utiliser l'interface utilisateur pour cela. Vous pouvez utiliser textComponent.modelToView (...). – camickr

+0

@camickr: Bon point, je suis surpris d'avoir manqué ça en faisant défiler l'API de JTextComponent mais je l'ai trouvé "plus profond" dans le TextUI :) Je pense: quelle est la "meilleure pratique" dans ce cas, mettez à jour ma réponse selon à votre commentaire ou le garder comme pour préserver "l'histoire"? – Uhlen

+0

Bonne question; deux pratiques courantes comprennent 1) afficher une réponse distincte avec l'approche alternative, et 2) ajouter un lien vers la section pertinente de l'historique «edit». – trashgod

0

Tout comme ci-dessous

Point point = textArea.getCaret().getMagicCaretPosition(); 

S'il vous plaît être conscient point pourrait être nul

0

J'ai fait celui-ci après avoir essayé les autres messages ici. Cela fonctionne parfaitement tant que votre zone de texte est désactivée.

public Point getCaretPixelPosition(JTextArea a) { 
    try { 
     int cpos = a.getCaretPosition(); 
     Font font = a.getStyledDocument().getFont(a.getStyledDocument().getLogicalStyle(cpos)); 
     FontMetrics metrics = getFontMetrics(font); 

     int lineNum = a.getLineOfOffset(cpos); 
     int y = lineNum * metrics.getHeight(); 
     int lineStart = a.getLineStartOffset(lineNum); 
     int x = metrics.stringWidth(a.getText().substring(lineStart, cpos)); 

        return new Point(x,y); 

    } catch(BadLocationException e) {} 
    return null; 
} 
0
Rectangle caretRect=textPane.getUI().modelToView(textPane,textPane.getCaretPosition()); 

ou

Rectangle caretRect=textPane.modelToView(textPane.getCaretPosition()); 

par exemple; utilisez ce rect pour afficher une fenêtre contextuelle:

popupMenu.show (textPane, caretRect.x, caretRect.y);

2

Notez que certaines de ces réponses renvoient l'emplacement par rapport au composant de texte dont vous obtenez la position du curseur.

Si vous voulez obtenir la position de caret à l'écran, je vous suggère d'utiliser cette méthode:

Caret caret = yourTextComponent.getCaret(); 
Point p = caret.getMagicCaretPosition(); 
p.x += yourTextComponent.getLocationOnScreen().x; 
p.y += yourTextComponent.getLocationOnScreen().y; 

aFrameYourePositioning.setLocation(p); 
+0

Celui-ci a travaillé comme un charme. J'ai eu des problèmes en utilisant une autre approche pour montrer un JPopupMenu en utilisant ces coordonnées, mais celui-ci était parfait. – Alfabravo

0

Voici un exemple pour afficher une JPopup à la position de caret

Caret caret = logText.getCaret(); 
Point p = new Point(caret.getMagicCaretPosition()); 
p.x += logText.getLocationOnScreen().x; 
p.y += logText.getLocationOnScreen().y; 

SwingUtilities.convertPointFromScreen(p, actionsPanel); 
popup.show(actionsPanel, p.x, p.y); 
Questions connexes