Java SWT StyledText:将下一行的插入符号定位到上一行的制表符宽度
我正在基于Java SWT StyledText:将下一行的插入符号定位到上一行的制表符宽度,java,position,swt,caret,styledtext,Java,Position,Swt,Caret,Styledtext,我正在基于SWT-StyledText开发一个(丰富的)编辑器。有一个功能,我到目前为止无法解决它。我希望我的编辑器在用户按Ctrl+u时将光标放置在选项卡宽度处,作为前一行的开始(类似于用户按Enter键时的Eclipse或Notepad++)。我试过几种方法,但都不管用。请看一看我的例子。欢迎提出任何建议。提前谢谢 StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); te
SWT-StyledText
开发一个(丰富的)编辑器。有一个功能,我到目前为止无法解决它。我希望我的编辑器在用户按Ctrl+u时将光标放置在选项卡宽度处,作为前一行的开始(类似于用户按Enter键时的Eclipse或Notepad++)。我试过几种方法,但都不管用。请看一看我的例子。欢迎提出任何建议。提前谢谢
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(5);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int currentLine = text.getLineAtOffset(text.getCaretOffset());
int currCaretOffset = text.getCaretOffset();
if(e.stateMask == SWT.CTRL && e.keyCode == 'u'){
//text.setIndent(text.getOffsetAtLine(currentLine));//doesn't work
text.append("\n");
//text.append("\t");//doesn't work
text.setCaretOffset(text.getCharCount()+text.getTabs());//doesn't work
System.out.println("caret offset "+text.getCaretOffset());
}
}
});
如果我理解正确,您希望将光标移动到下一行,并将其缩进与前一行中前导空格相同的“空白” 我很惊讶没有更好的方法来实现这一点(或者我还没有找到更好的方法),但这样做就可以了:
private static final int TAB_WIDTH = 5;
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Stackoverflow");
shell.setLayout(new FillLayout());
StyledText text = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
text.setTabs(TAB_WIDTH);
text.setText("");
text.setLeftMargin(5);
text.setBounds(0, 0, 512, 391);
text.addListener(SWT.KeyUp, (e) -> {
if (e.stateMask == SWT.CTRL && e.keyCode == 'u')
{
int currentLine = text.getLineAtOffset(text.getCaretOffset());
String textAtLine = text.getLine(currentLine);
int spaces = getLeadingSpaces(textAtLine);
text.insert("\n");
text.setCaretOffset(text.getCaretOffset() + 1);
for (int i = 0; i < spaces; i++)
text.append(" ");
text.setCaretOffset(text.getCaretOffset() + spaces);
}
});
shell.pack();
shell.open();
shell.setSize(400, 300);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static int getLeadingSpaces(String line)
{
int counter = 0;
char[] chars = line.toCharArray();
for (char c : chars)
{
if (c == '\t')
counter += TAB_WIDTH;
else if (c == ' ')
counter++;
else
break;
}
return counter;
}
private static final int TAB_WIDTH=5;
公共静态void main(字符串[]args)
{
最终显示=新显示();
最终外壳=新外壳(显示);
shell.setText(“Stackoverflow”);
setLayout(新的FillLayout());
StyledText text=新的StyledText(shell,SWT.BORDER | SWT.H|u SCROLL | SWT.V|u SCROLL);
text.setTabs(制表符宽度);
text.setText(“”);
text.setLeftMargin(5);
文本.setBounds(0,0,512,391);
text.addListener(SWT.KeyUp,(e)->{
如果(e.stateMask==SWT.CTRL&&e.keyCode=='u')
{
int currentLine=text.getlineatofset(text.getcaretofset());
字符串textAtLine=text.getLine(currentLine);
int spaces=getleadingspace(textAtLine);
文本。插入(“\n”);
text.setCaretOffset(text.getCaretOffset()+1);
for(int i=0;i
是的,这正是我想要做的。非常感谢你。我也有点想用“”填充,但没有成功。PS:我在为盲文显示工作,空白有时不太好,因为盲文显示一次只能显示有限的字符(40个字符)。但我会设法处理的。谢谢。@APex您也可以使用制表符。是的。。我也试着这么做。。谢谢