+-
java – 将JScrollPane的可见区域移动到特定位置
我试图使用 java模拟调试光标的移动.我有问题将JScrollPane的可视区域放到正确的位置.

这是我想要拍摄的照片:
The desired layout

我只想滚动我想跳的线是不可见的.计算是否有帮助可以通过使用CodeDrowingPanel.NUMBER_OF_LINES和CodeDrowingPanel.FONT_SIZE完成,使用这些常量在面板上绘制线条.

如果我必须跳,我必须跳的线应该在底部.

我必须记住,可见区域取决于屏幕分辨率.应用程序已最大化,无法调整大小.

编辑:

public void setCursorToLine(int line, JScrollPane codeArea)
{
    if(line*CodeDrowingPanel.FONT_SIZE > this.getHeight()+43)
        this.cursorPosition = this.getHeight()+43;
    else
        this.cursorPosition = line * CodeDrowingPanel.FONT_SIZE;
    JViewport viewPort = (JViewport) SwingUtilities.getAncestorOfClass(JViewport.class, codeArea);
    if (viewPort != null) 
    {
        Rectangle view = viewPort.getViewRect();
        view.y += line - previousLine;

        codeArea.scrollRectToVisible(view);
    }
    this.repaint();
}

这就是我现在尝试修改的方法.但它不起作用.我尝试从第一条评论中跟随你的第二个例子.我不知道如何使用第二条评论中的方法.

最佳答案
enter image description here

我不认为行号应该是文本的一部分.例如,您有一个水平滚动条.如果向右滚动,则会丢失行号.

相反,您应该使用行标题来显示行号.

请参阅Text Component Line Number.它包含一个为您自定义绘制行号的类.您可以使用将此组件添加到行标题.

该类中的绘制代码将突出显示当前行号.如果要添加箭头,则需要修改绘制代码.在paintComponent(…)方法中,您可以添加以下内容:

g.drawString(lineNumber, x, y);  

//  Code to paint an arrow

if (isCurrentLine(rowStartOffset))
{
    int height = fontMetrics.getAscent() - fontMetrics.getDescent();

    Polygon triangle = new Polygon();
    triangle.addPoint(borderGap, y);
    triangle.addPoint(borderGap, y - height);
    triangle.addPoint(borderGap + 10, y - height / 2);
    Graphics2D g2d = (Graphics2D)g.create();
    g2d.fill( triangle );
    g2d.dispose();
}

还有一个变化.由于我们现在正在绘制箭头,我们需要增加组件的宽度.因此,在setPreferredWidth(…)方法中,您需要进行以下更改:

//int preferredWidth = insets.left + insets.right + width;
int preferredWidth = insets.left + insets.right + width + 15;

I want to scroll only if the line I want to jump it is not visible.

以下是一些代码:

public static void gotoStartOfLine(JTextComponent component, int line)
{
    Element root = component.getDocument().getDefaultRootElement();
    line = Math.max(line, 1);
    line = Math.min(line, root.getElementCount());
    int startOfLineOffset = root.getElement( line - 1 ).getStartOffset();
    component.setCaretPosition( startOfLineOffset );
}

我从Text Utilities获取了上面的代码,可能有其他感兴趣的方法(如果不是现在,将来).

如果要在文本窗格中突出显示整行,也可以使用Line Painter.

点击查看更多相关文章

转载注明原文:java – 将JScrollPane的可见区域移动到特定位置 - 乐贴网