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