Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT StyledText:将下一行的插入符号定位到上一行的制表符宽度_Java_Position_Swt_Caret_Styledtext - Fatal编程技术网

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您也可以使用制表符。是的。。我也试着这么做。。谢谢