Java jTable swing get输入问题
我有一个getInput方法,它在输入时从文本字段中获取字符串。我创建了while循环,以等待onClickListener返回true(按Enter键)。这是我的密码: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
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时自动处理编辑器的关闭。您确实需要描述您的需求,因为我确信有更好的解决方案可用。