Java - KeyListener未工作/鼠标位置未读取

时间:2016-05-31 20:49:16

标签: java swing user-interface button

所以我有一个按钮,按下时需要将当前鼠标位置写到文本框,直到用户按下shift,然后它停止并将最近的鼠标位置保留为文本框中的最终文本。继承人我做了什么:

首先创建了以下类。

public class KeyListener extends KeyAdapter {
    private boolean wasPressed = false;
    private int keyCode;

    public KeyListener(int keyCode) {
        this.keyCode = keyCode;
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("CALLED");
        if(e.getKeyCode() == keyCode)
            wasPressed = true;
    }

    public void setState(boolean state) {
        wasPressed = state;
    }

    public boolean getState() {
        return wasPressed;
    }
}

然后在我的“主”课程中,我有以下代码。

JButton track1 = new JButton("Track");
KeyListener kl = new KeyListener(KeyEvent.VK_SHIFT);
...
public DisplayFrame() {
    this.addKeyListener(kl);
    track1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event) {
            kl.setState(false);
            while(!kl.getState()) {
                Point p = MouseInfo.getPointerInfo().getLocation();
                topLeft.setText(p.getX() + "," + p.getY());
            }
        }
    });
}

然后我当然将文本框添加到JPanel并且它正确显示所有内容,但是,当我单击“跟踪”按钮时没有任何反应。我可以说它正在进入循环,但文本框中没有显示文本,按shift也不会打破循环。

1 个答案:

答案 0 :(得分:0)

尝试在actionPerformed方法中创建一个新线程,如下所示:

Thread exampleThread = new Thread() {

    public void run() {
        //Do your actions within the new thread
    }
};

//After the thread is made, we start it.
exampleThread.start();

你必须这样做,因为actionListener在另一个线程中运行。