2010-12-30 26 views

Respuesta

0

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. :)

3

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(); 
      } 
     }); 
    } 
} 
+1

+1 , No necesita usar la IU para esto. Puede usar textComponent.modelToView (...). – camickr

+0

@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

+0

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

0

igual que a continuación

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

Por favor, tenga en cuenta el punto podría ser nula

0

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; 
} 
0
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);

2

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); 
+0

Este funcionó como un encanto. Tuve problemas al usar cualquier otro enfoque para mostrar un JPopupMenu usando estas coordenadas, pero este fue perfecto. – Alfabravo

0

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); 
Cuestiones relacionadas