Как найти позицию курсора в JTextArea - PullRequest
6 голосов
/ 30 декабря 2010

Может ли кто-нибудь помочь мне найти позицию курсора в JTextArea с точки зрения пикселей?Я использовал txtArea.getCaretPosition().Но это не та позиция, которую я ожидаю.На самом деле я хочу, чтобы положение курсора в x,y координате пикселя.

Ответы [ 7 ]

3 голосов
/ 30 декабря 2010

TextUI есть метод modelToView, который даст вам позицию / размер каретки:

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();
            }
        });
    }
}
2 голосов
/ 28 апреля 2012

Обратите внимание, что некоторые из этих ответов возвращают местоположение относительно текстового компонента, из которого вы получаете позицию каретки.

Если вы хотите получить позицию каретки на экране, я предлагаю вам использовать этот метод:

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

aFrameYourePositioning.setLocation(p);
0 голосов
/ 18 апреля 2017

Вот пример для отображения JPopup в позиции каретки

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);
0 голосов
/ 18 октября 2011
Rectangle caretRect=textPane.getUI().modelToView(textPane,textPane.getCaretPosition());

или

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

например;используйте этот прямоугольник для отображения всплывающего окна:

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

0 голосов
/ 05 мая 2011

Я сделал это после того, как попробовал другие посты здесь.Он отлично работает, если в текстовой области отключено перенос текста.

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 голосов
/ 29 апреля 2011

Как показано ниже

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

Пожалуйста, имейте в виду, что точка может быть нулевой

0 голосов
/ 30 декабря 2010

Возможно, вам придется использовать класс FontMetrics.
Проанализируйте текст, выясните новые строки / перенос текста. затем используйте

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

и т.д ....

И если вы действительно хотите, опубликуйте свое решение здесь, чтобы оно было классным. :)

...