获取多行文本字段中的光标位置

Get cursor position in a multiline text field

我尝试在多行文本字段中获取行号和 "columns"。问题是,如果我使用 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;
}

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

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

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;