【问题标题】:Get cursor position in a multiline text field获取多行文本字段中的光标位置
【发布时间】:2016-06-24 10:24:06
【问题描述】:

我尝试在多行文本字段中获取行号和“列”。问题是,如果我使用 getSelection() 并向下移动光标,我会得到 {0:0}、{5,5}、{10,10}。但我期望的是 {0,0}(第一行,第一列),{0,1}(第二行,第一列)和 {0,2}(第三行,第一列):

protected Control createContents(Composite parent) {
  Composite container = new Composite(parent, SWT.NONE);
  container.setLayout(new GridLayout());

  Text textBox = new Text(container, SWT.BORDER | SWT.H_SCROLL | SWT.MULTI | SWT.V_SCROLL);
  textBox.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
  textBox.setText("one\ntwo\nthree");
  textBox.setSelection(0);
  textBox.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
      System.out.println(textBox.getSelection());
    }
  });

  return container;
}

【问题讨论】:

    标签: java text swt


    【解决方案1】:

    Text.getSelection 总是返回从选择字符串开始的偏移量。它对线条一无所知。

    因此,您必须将偏移量转换为行号。一种可能性是使用 JFace Document

    Document doc = new Document(text);
    
    int lineNumber = doc.getLineOfOffset(offset);
    

    或者使用StyledText 控件,它也有getLineAtOffset 和类似的方法。比如:

    Point sel = styledText.getSelection();
    
    int lineNumber = styledText.getLineAtOffset(sel.x);
    
    int lineOffset = styledText.getOffsetAtLine(lineNumber);
    
    int column = sel.x - lineOffset;
    

    【讨论】:

    • 好的,StyledText 看起来对我的目的很有用。但是我怎样才能得到正确的光标位置,f.e.光标放在第 10 行的第一个字符上? getLineAtOffset 方法只返回行索引,而不是“列”号(X 坐标)。
    • 添加了 StyledText 示例
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多