代码之家  ›  专栏  ›  技术社区  ›  TEK

按下分号时,将光标放在下一行

  •  2
  • TEK  · 技术社区  · 10 年前

    当用户按下分号键时,我希望分号保持在同一行,但光标向下移动。例如

    我想要什么

    示例文本<--按下并输入分号

    |<---光标移到此处

    我现在的代码,分号向下移动,光标放在旁边,如下所示:

    我所拥有的

    示例文本

    ;| <--光标和分号转到新行

    非常感谢。

    ssce公司 :

    import java.awt.Font;
    import javax.swing.InputMap;
    import javax.swing.JFrame;
    import javax.swing.JTextPane;
    import javax.swing.KeyStroke;
    import javax.swing.WindowConstants;
    
    public class Example {
    
    private final JFrame frame = new JFrame();
    private final JTextPane editor = new JTextPane();
    
    public Example() {
        frameStuff();
        newLineOnSemiColonPress();
    }
    
    private void newLineOnSemiColonPress() {
        InputMap input = editor.getInputMap();
        String INSERT_BREAK = "insert-break";
        KeyStroke semi = KeyStroke.getKeyStroke("SEMICOLON");
        input.put(semi, INSERT_BREAK);
    }
    
    private void frameStuff() {
        editor.setFont(new Font("Arial", 0, 13));
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frame.setSize(new Dimension(500, 400));
        frame.getContentPane().add(editor);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new Example();
    }
    }
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   azurefrog    10 年前

    您只需在释放分号键时,而不是在第一次按下分号键时将break添加到:

    private void newLineOnSemiColonPress() {
        InputMap input = editor.getInputMap();
        String INSERT_BREAK = "insert-break";
        KeyStroke semi = KeyStroke.getKeyStroke("released SEMICOLON");
        input.put(semi, INSERT_BREAK);
    }
    

    如果你还没有读过,有一个很好的 tutorial here 以及有关如何使用密钥绑定的更多信息。

        2
  •  1
  •   JDong    10 年前

    我对你的代码或Java不太熟悉,但问题是你做事情的顺序不对。 要么在插入分号后插入换行符,要么通过向右移动光标进行临时修复。

    也许是这样的:

    private void newLineOnSemiColonPress() {
        InputMap input = editor.getInputMap();
        String INSERT_BREAK = "insert-break";
        KeyStroke semi = KeyStroke.getKeyStroke("SEMICOLON");
        input.put(semi, INSERT_RIGHT_ARROW);
        input.put(semi, INSERT_BREAK);
    }
    

    或者返回代码,确保在调用newLineOnSemicolonPress之前处理字符插入。(正如所指出的,这可以通过使用on_key_release处理事件来完成)