Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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 JTextArea-清除文本并将插入符号返回起始区域_Java_Swing_Jtextarea_Keylistener - Fatal编程技术网

Java JTextArea-清除文本并将插入符号返回起始区域

Java JTextArea-清除文本并将插入符号返回起始区域,java,swing,jtextarea,keylistener,Java,Swing,Jtextarea,Keylistener,我有个小问题,但很烦人。我使用一个JTextArea通过一个KeyListener捕获输入——它只是在按下返回按钮后捕获输入。问题是,当我清除文本时,插入符号停留在第二行,这很恼人 代码如下: @SuppressWarnings ("serial") public class ProgramEditor extends JTextArea implements KeyListener { //FIELDS String command = ""; //CONSTRUC

我有个小问题,但很烦人。我使用一个JTextArea通过一个KeyListener捕获输入——它只是在按下返回按钮后捕获输入。问题是,当我清除文本时,插入符号停留在第二行,这很恼人

代码如下:

@SuppressWarnings ("serial")
public class ProgramEditor extends JTextArea implements KeyListener {

    //FIELDS
    String command = "";

    //CONSTRUCTOR
    public ProgramEditor() {
        super();
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        this.setLineWrap(true);

        addKeyListener(this);

        this.requestFocus();
     }

    @Override
    public void keyPressed(KeyEvent e) {
         int i = e.getExtendedKeyCode();
         if (i == 10){
            command = this.getText();
            this.setText(null);
        }
    }
}

尝试JTextArea中的
setCaretPosition(int)
方法,特别是将
键按入

@Override
public void keyPressed(KeyEvent e) {
    int i = e.getExtendedKeyCode();
if (i == 10){
    command = this.getText();
    this.setText(""); //I'd use "" over null; it just seems more proper to keep a string even if there's no difference
    this.setCaretPosition(0);
}
}
检查此项:

尝试使用此项:

this.setCaretPosition(0);

Swing使用键绑定来处理事件。对于JTextArea,Enter键由键绑定处理,键绑定将换行符字符串插入文本区域。所以这个代码是在你按下键后执行的

正确的解决方案是将Enter键的默认操作替换为您自己的自定义操作。有关更多信息和示例,请阅读Swing教程中的部分

问题是为什么在用户不能输入换行符的情况下使用JTextArea?更简单的解决方案是只使用JTextField。然后,您可以向文本字段添加ActionListener来处理Enter键


最后,最糟糕的解决方案是尝试处理keyReleased()方法。然后,应该执行文本区域的enter键的默认操作。

因为我的输入超过一行。
this.requestFocus(true)我很确定这已经被弃用了,如果是这样,编译器将发出警告。不要忽略编译器警告,修复它们!顺便说一句,上面的一些(格式不好的)代码是不必要的,其余的大部分是糟糕的设计或纯粹糟糕的编码。如果你从一个网站上得到了这个例子,就不要再访问那个网站了。这是在教你坏习惯。也许你能告诉我应该怎么做?这可能比把我的工作糟蹋更有用?1)使用
DocumentListener
而不是
KeyListener
。2) 使用工厂方法制作这样的文本区域比扩展组件要好。3)
this.setFocusable(true)是无意义的,因为这是默认值。4) 调用
requestFocus()
将失败。(如果它在你的应用程序中被聚焦,那是因为它是第一个聚焦组件)。5)
requestFocus(true)应为
requestInWindowFocus(true)。6) 
如果(i==10){
不使用幻数,则为键定义了常量。7)
setText(null)
已包含在答案中。--但这不是代码复查。我想你是在尽力提供帮助,所以…谢谢,我想…那不管用,我不知道为什么…但这是我尝试的第一件事。我尝试了这个。setCaratPosition(1)太-这把克拉放在正确的位置,但它抛出了运行时异常…我使用jText区域与文本换行,因为命令的长度可能非常长,在许多情况下不适合在一行,用户需要能够回顾文本。它本质上是一个宏程序员为一个小动画程序I设计……否则我会使用文本字段——不是吗?我的意思是我考虑过使用JButton而不是return键来获取输入的文本-但是如果有人按下return按钮,那么就不可能再次清除文本区域-这看起来很疯狂。我会阅读关于绑定的部分,看看我是否我能找到解决办法。谢谢。