Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 jTable swing get输入问题_Java_Input_Onclick_While Loop_Jtextfield - Fatal编程技术网

Java jTable swing get输入问题

Java jTable swing get输入问题,java,input,onclick,while-loop,jtextfield,Java,Input,Onclick,While Loop,Jtextfield,我有一个getInput方法,它在输入时从文本字段中获取字符串。我创建了while循环,以等待onClickListener返回true(按Enter键)。这是我的密码: public String getInput(){ jTextField1.setEditable(true); jTextField1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.aw

我有一个getInput方法,它在输入时从文本字段中获取字符串。我创建了while循环,以等待onClickListener返回true(按Enter键)。这是我的密码:

public String getInput(){
    jTextField1.setEditable(true);
    jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            temp=jTextField1KeyPressed(evt);
        };
    });
    while(!(temp)){
    }
    temp=false;
    jTextField1.setEditable(false);
    String s= jTextField1.getText();
    jTextField1.setText("");
    return s;

}

private boolean jTextField1KeyPressed(KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_ENTER)
        return true;
    else return false;
};
现在我遇到了一个非常奇怪的问题:如果我在while循环中添加System.out.println语句,它就可以完美地工作,如果我删除它,while循环就永远不会存在。问题在哪里?
提前谢谢

您需要一些同步,以便将对
temp
的更改传播到所有需要的线程。但是从-
getInput
开始是一种不好的方法,它会在
中浪费大量CPU循环,而
并没有什么好的用途

你可以做得更干净。首先,将
temp
声明为
java.lang.Object
,并将其初始化为普通的旧对象:

private Object temp = new Object();
(或者类似的事情。)

在getInput中,而不是:

while (!temp) { }
temp = false;
这样说:

synchronized (temp) {
  try {
    temp.wait();
  } catch (InterruptedException ie) {
    // handle this situation: something interrupted your thread before input was finished
  }
}
在事件处理程序中:

synchronized (temp) {
  temp.notify();
}
这样,运行
getInput
的线程将保持休眠状态,等待发生某些事情,而不是消耗CPU周期

还有采用超时值的
wait()
变体。您可能也对使用这些工具感兴趣。

您的问题称为“忙等待”。您必须等待,直到操作系统告诉您,Enter被按下。以每秒100000000次的速度问一个假问题“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”、“是否按Enter键?”

您可以尝试使用以下方法:

jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyPressed(java.awt.event.KeyEvent evt) {
        temp=jTextField1KeyPressed(evt);
        if (temp==true) EnterPressed();
    };
});
void EnterPressed() {
    //enter code here
}

如果从事件线程调用getInput,您将陷入一个无休止的循环中。变量temp可能永远不会更新,因为无法再处理任何事件

如果您想收集一个简单的输入,您可能需要研究一个解决方案,如

String info = JOptionPane.showInputDialog(this, "Please enter info");

您的解决方案看起来很棒,但是我遇到了NullPointerException崩溃。temp.wait()和temp.notify()在同步上下文之外调用Object.wait时发出警告。可能有什么问题?对不起,我没有对我输入的内容给予足够的关注。我已经编辑了我的帖子
temp
需要在构造函数中或直接在类的定义站点中初始化一次。顺便说一句,
temp
是一个非常糟糕的变量名,但不是一个非常短的、函数范围的临时变量。谢谢,一切正常。对于其他所有有相同问题的人,您还必须将temp.notify()与synchronized放在一起。干杯我不知道你想做什么,但你的解决方案似乎过于复杂。永远不要创建“while循环”来等待输入。永远不要使用KeyListener来侦听enter键。为此,可以向文本字段添加ActionListener。最后,您的标题提到了一个JTable。当您在表中编辑cel时,编辑器会在使用enter时自动处理编辑器的关闭。您确实需要描述您的需求,因为我确信有更好的解决方案可用。