Java JTextArea-与现有文本一致的抽绳

Java JTextArea-与现有文本一致的抽绳,java,swing,drawstring,Java,Swing,Drawstring,以下代码段在JTextArea中绘制了一个建议的自动完成字符串: @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (suggestion != null && isSuggesting()) { final String selectedSuggestion = suggestion.list.getSel

以下代码段在
JTextArea
中绘制了一个建议的自动完成字符串:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (suggestion != null && isSuggesting()) {
        final String selectedSuggestion = 
                suggestion.list.getSelectedValue().getValue().substring(
                        suggestion.subWord.length());
        g.setColor(Color.GRAY);
        final int position = getCaretPosition();
        Point location;
        try {
            location = modelToView(position).getLocation();
        } catch (BadLocationException e2) {
            e2.printStackTrace();
            return;
        }
        //TODO: 13 ???
        g.drawString(
                selectedSuggestion, 
                location.x, 
                13 + location.y);
    }
}
我使用了神奇的数字13,这在我的L&F中非常棒:


但是如何计算通用字体大小/L&F当前行的右
y
位置?

您可以使用当前字体大小计算正确的位置

只需将当前字体大小添加到location.y,如下所示:

g、 抽绳(selectedSuggestion,location.x,g.getFont().getSize()+location.y)

编辑:使用FontMetrics

    FontMetrics fm = getFontMetrics(g.getFont());
    int heightToAdd=(int)fm.getStringBounds("Sample Text", g).getHeight();
    g.drawString("Sample text", location.x, location.y+heightToAdd);
这只是一些随机文本的尝试


请参阅此处的java文档:

您可以使用当前字体大小来计算正确的位置

只需将当前字体大小添加到location.y,如下所示:

g、 抽绳(selectedSuggestion,location.x,g.getFont().getSize()+location.y)

编辑:使用FontMetrics

    FontMetrics fm = getFontMetrics(g.getFont());
    int heightToAdd=(int)fm.getStringBounds("Sample Text", g).getHeight();
    g.drawString("Sample text", location.x, location.y+heightToAdd);
这只是一些随机文本的尝试


请参阅此处的java文档:

也许我遗漏了一些东西,但您已经获得了所需的信息:

Rectangle r = textArea.modelToView( textArea.getCaretPosition() );
int yOffset = r.y + r.height;

也许我遗漏了什么,但你已经掌握了你需要的信息:

Rectangle r = textArea.modelToView( textArea.getCaretPosition() );
int yOffset = r.y + r.height;

这不管用。它在线条上方绘制一到两个像素的字符串。我想这是因为每一行都有一定的界限,但我不知道如何判断它的大小。好吧,使用13对你有用,因为默认的字体大小是12。因此,它调整得很好。顺便问一下,您希望输出的内容与图像中的显示方式相同,还是建议与键入的文本在同一行?因为添加字体大小或数字会使其显示在键入的文本下方。我希望它与图像中显示的灰色文本一样,与键入的文本在同一行。你是说fontsize+1应该总是可以的?这1个像素是从哪里来的?我如何知道文本行的插入?好的。fontsize+1不一定有效。是的,需要注意的是添加了1个像素。我太不明白了。您还可以尝试使用FontMetrics获取边界。我在答案中做了一些编辑。我使用了以下内容:
intheighttoadd=(int)(fm.getStringBounds(“示例文本”,g).getHeight()-g.getFont().getSize())/2
并将字体大小添加到其中。但我仍然有一种感觉,这不是正确的方式…这不起作用。它在线条上方绘制一到两个像素的字符串。我想这是因为每一行都有一定的界限,但我不知道如何判断它的大小。好吧,使用13对你有用,因为默认的字体大小是12。因此,它调整得很好。顺便问一下,您希望输出的内容与图像中的显示方式相同,还是建议与键入的文本在同一行?因为添加字体大小或数字会使其显示在键入的文本下方。我希望它与图像中显示的灰色文本一样,与键入的文本在同一行。你是说fontsize+1应该总是可以的?这1个像素是从哪里来的?我如何知道文本行的插入?好的。fontsize+1不一定有效。是的,需要注意的是添加了1个像素。我太不明白了。您还可以尝试使用FontMetrics获取边界。我在答案中做了一些编辑。我使用了以下内容:
intheighttoadd=(int)(fm.getStringBounds(“示例文本”,g).getHeight()-g.getFont().getSize())/2
并将字体大小添加到其中。但我仍然有一种感觉,那不是正确的方式…@Elist,那么我想我错过了什么。这相当于文本区域使用的间距。怎么这么低?您对“Y位置”的确切要求是什么?你想在“By”中的“y”下画一个像素吗?如果是这样,那么您需要通过使用上升、下降等来更多地使用字体度量。。值来确定要使用的确切位置。我同意随机除以2不是正确的方法。@Elist,那么我想我遗漏了什么。这相当于文本区域使用的间距。怎么这么低?您对“Y位置”的确切要求是什么?你想在“By”中的“y”下画一个像素吗?如果是这样,那么您需要通过使用上升、下降等来更多地使用字体度量。。值来确定要使用的确切位置。我同意随机除以2不是正确的方法。