如何在JTextArea中找到Cursor位置

时间:2010-12-30 20:01:53

标签: java swing jtextarea

有人帮助我在像素方面找到JTextArea中的光标位置吗? 我使用过txtArea.getCaretPosition()。但这不是我期望的立场。实际上我希望光标位于像素的x,y坐标。

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

请注意,其中一些答案会返回相对于您从插入符号位置的文本组件的位置。

如果您想在屏幕上显示插入符的位置,我建议您使用此方法:

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

aFrameYourePositioning.setLocation(p);

答案 2 :(得分:0)

您可能必须使用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();  

等...

如果你真的想要,可以在这里发布你的解决方案。 :)

答案 3 :(得分:0)

如下所示

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

请注意,该点可能为空

答案 4 :(得分:0)

我在这里尝试了其他帖子后做了这个。只要你的textarea禁用了文本换行,它就能很好地工作。

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

答案 5 :(得分:0)

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

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

;使用此rect显示弹出窗口:

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

答案 6 :(得分:0)

以下是在插入符号位置显示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);