Quelqu'un pourrait m'aider à trouver la position du curseur dans un JTextArea en termes de pixels? J'ai utilisé txtArea.getCaretPosition()
. Mais ce n'est pas la position à laquelle je m'attends. En fait je veux la position du curseur dans x,y
coordonnée de pixel.Comment trouver la position du curseur dans un JTextArea
Répondre
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. :)
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();
}
});
}
}
Tout comme ci-dessous
Point point = textArea.getCaret().getMagicCaretPosition();
S'il vous plaît être conscient point pourrait être nul
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;
}
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);
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);
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
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);
- 1. Trouver la position du curseur
- 2. La position du curseur est désactivée dans JTextArea
- 3. Comment trouver la position du curseur dans un NSTextView?
- 4. Trouver la position du curseur dans un TextBox
- 5. Jquery - comment puis-je trouver la position actuelle du curseur
- 6. Comment obtenir la position du curseur dans une éclipse TextEditor
- 7. Position du curseur, jquery
- 8. Trouver la position du curseur sur une fenêtre GtkSourceView
- 9. Comment déterminer la position actuelle du curseur dans un UITextField?
- 10. Trouver la position du curseur à l'intérieur de l'élément
- 11. Position du curseur dans EditText
- 12. Comment puis-je obtenir la position du curseur/curseur dans un élément d'entrée HTML?
- 13. Comment obtenir la position du curseur
- 14. EditText position du curseur
- 15. Position du curseur
- 16. Définir la position Caret avec JTextArea dans JScrollPane
- 17. Comment trouver une position de pixel d'un curseur dans UITextView?
- 18. Définir la position du curseur IME dans un contrôle C#
- 19. Comment définir la position du curseur dans textField dans j2me?
- 20. Comment réinitialiser la position du curseur de la souris Selenium?
- 21. position du curseur du reglage après suppression
- 22. Définir la position du curseur dans un widget Texte
- 23. Obtention de la position du curseur dans un RichTextBox
- 24. Comment obtenez-vous la position du caractère sélectionné dans un JTextArea?
- 25. Comment obtenir la position du curseur dans bash?
- 26. Comment déterminer la position du curseur de texte dans Windows
- 27. Comment réserver la position du curseur dans le contrôle CEdit?
- 28. Comment obtenir la position du curseur dans contentEditable contenant HTML?
- 29. Insérer du texte dans RichTextEditor à la position du curseur
- 30. Modifier la position du curseur de texte
+1 , Vous n'avez pas besoin d'utiliser l'interface utilisateur pour cela. Vous pouvez utiliser textComponent.modelToView (...). – camickr
@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
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