¿Me ayudaría alguien a encontrar la posición del cursor en un JTextArea en términos de píxel? He usado txtArea.getCaretPosition()
. Pero esta no es la posición que espero. En realidad, quiero la posición del cursor en x,y
coordenada de píxel.Cómo encontrar la posición del cursor en un JTextArea
Respuesta
Puede que tenga que utilizar la clase FontMetrics.
Analice el texto, descubra las nuevas líneas/envoltura del texto. a continuación, utilizar
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 ....
Y si realmente desea, publicar su solución aquí para ser cool. :)
TextUI tienen modelToView
método que va a dar que la posición/tamaño del símbolo de intercalación:
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();
}
});
}
}
igual que a continuación
Point point = textArea.getCaret().getMagicCaretPosition();
Por favor, tenga en cuenta el punto podría ser nula
Hice esto después de probar las otras publicaciones aquí. Funciona perfectamente siempre que tu texto esté desactivado.
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());
o
Rectangle caretRect=textPane.modelToView(textPane.getCaretPosition());
por ejemplo; use este rect para mostrar ventana emergente:
popupMenu.show (textPane, caretRect.x, caretRect.y);
Tenga en cuenta que algunas de estas respuestas devuelven la ubicación relativa al componente de texto del que está obteniendo la posición de intercalación.
Si desea obtener la posición del cursor en la pantalla, le sugiero que utilice este método:
Caret caret = yourTextComponent.getCaret();
Point p = caret.getMagicCaretPosition();
p.x += yourTextComponent.getLocationOnScreen().x;
p.y += yourTextComponent.getLocationOnScreen().y;
aFrameYourePositioning.setLocation(p);
Este funcionó como un encanto. Tuve problemas al usar cualquier otro enfoque para mostrar un JPopupMenu usando estas coordenadas, pero este fue perfecto. – Alfabravo
Aquí se muestra un ejemplo para mostrar un JPopup en la posición de intercalación
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. La posición del cursor está desactivada en JTextArea
- 2. Encontrar la posición del cursor en un cuadro de texto
- 3. ¿Cómo encontrar la posición del cursor en una DIV contenteditable?
- 4. Cómo obtener la posición del cursor en un eclipse TextEditor
- 5. Encontrar la posición del texto del cursor en JTextField
- 6. ¿Cómo encontrar la posición global del cursor de texto?
- 7. Cómo obtener la posición del cursor en un Edittext
- 8. posición del cursor en un UITextView
- 9. Cómo obtener la posición del cursor
- 10. Posición del cursor en la abreviatura VIM
- 11. Cómo establecer la posición del cursor en UITextView
- 12. posición del cursor del mouse en Javascript?
- 13. Establecer la posición del cursor en un widget de texto
- 14. Obteniendo la posición del cursor en un Textarea
- 15. EditTextPreference y la posición predeterminada del cursor
- 16. La posición del cursor cambió el evento
- 17. Cómo determinar la posición del cursor de texto en Windows
- 18. ¿Cómo obtener la posición del cursor en bash?
- 19. ¿Cómo navegar a la última posición del cursor en Eclipse?
- 20. ¿Cómo obtengo la posición actual del cursor de la pantalla?
- 21. jQuery Establecer posición del mouse (no posición del cursor)
- 22. Posición del cursor de control en UITextField
- 23. Obtener la posición del cursor en Android en Editar texto?
- 24. ¿Cómo encontrar la posición de intercalación en un NSTextView?
- 25. Establecer la posición del cursor en Mac OS
- 26. Insertar cadena en la posición del cursor de UITextField
- 27. Windows Forms Posición del cursor RichTextBox
- 28. jquery Establecer la posición del cursor en contenteditable div
- 29. VIM: Añadir espacios en la posición del cursor
- 30. cómo insertar texto en cualquier posición del cursor en uitextview?
+1 , No necesita usar la IU para esto. Puede usar textComponent.modelToView (...). – camickr
@camickr: Buen punto, me sorprende que me haya perdido esto al desplazarme a través de API de JTextComponent pero lo encontré "más profundo" en el TextUI :) Estoy pensando: ¿cuál es la "mejor práctica" en casos como este? Actualiza mi respuesta de acuerdo a su comentario o mantenerlo como para preservar la "historia"? – Uhlen
Buena pregunta; dos prácticas comunes incluyen 1) publicar una respuesta por separado con el enfoque alternativo, y 2) agregar un enlace a la sección de historial de 'edición 'relevante. – trashgod