如何无限运行keylistener直到它注册某些输入?

时间:2017-08-08 05:16:30

标签: java loops window keylistener

目前,我正在尝试使用一个非常基本的工具,让用户在屏幕上看到它们更新时移动对象,但仅限于特定时间(当他们有选择移动的对象时)。所以我最初认为我可以只有一个JOptionPane消息,并让用户移动对象,直到他们对它感到满意为止,然后在框中按ok停止他们的动作并最终确定位置。

像这样:

inMotion=true;
JOptionPane.showMessageDialog(
    frame,
    "Move object to spot using arrow keys",
    "Edit Object",
    JOptionPane.PLAIN_MESSAGE);
inMotion=false;

使用如下的KeyPressed代码:

public void keyPressed(KeyEvent e) 
{
    int moveX=0;
    int moveY=0;
    if(inMotion)
    {
        if(e.getKeyCode()==KeyEvent.VK_UP){moveY=-1;}
        if(e.getKeyCode()==KeyEvent.VK_LEFT){moveX=-1;}
        if(e.getKeyCode()==KeyEvent.VK_RIGHT){moveX=1;}
        if(e.getKeyCode()==KeyEvent.VK_DOWN){moveY=1;}
        //Set object position code here
    }
}

然而,单独的窗口显然不允许keylistener为主框架运行。所以在这之后,我尝试了一个while循环,只需在用户关闭窗格后按住用户,直到他们按下Enter键,这将设置位置。

像这样:

inMotion=true;
JOptionPane.showMessageDialog(
    frame,
    "Move object to spot using arrow keys",
    "Edit Object",
    JOptionPane.PLAIN_MESSAGE);
while(inMotion){}

KeyPressed在循环中添加了这一行

if(e.getKeyCode()==KeyEvent.VK_ENTER){inMotion=false;}

但是,即使用户专注于右侧窗口,无限循环也不允许keylistener运行。我尝试使用命令

frame.setEnabled(true); 
And
frame.enableInputMethods(true);   

但这也不起作用,我真的不知道他们做了什么,所以这可能不好。任何让keylistener在合适的时间检查密钥的帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

我尝试了多个线程,覆盖窗口的非模态状态,甚至在外部窗口中添加了一个keylistener。最后,我发现我可以通过让主窗口本身只是通过布尔值冻结命令来做一个解决方案,这将在输入结束时设置为true。

//inputs
//gets width,height,etc of item
JOptionPane.showMessageDialog(frame,"Move the item using arrow keys"
+" and press enter when it is in the correct place.");
inMotion=true;

//draw method
if(!inMotion)
{Every other command in the tool}
else
{just draw motion of the object}

然后keylistener将使用enter键禁用inmotion