2016-05-31 6 views
0

ボタンを押すと、現在のマウス位置をテキストボックスに書き込む必要があり、ユーザーがShiftキーを押すまで停止し、最新のマウス位置をテキストボックスの最後のテキスト私が何をしたかHeres:

最初のaは次のクラスを作成しました。Java - KeyListenerが動作していない/マウス位置が読み取られない

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キーを押すとループが中断されません。

+0

1. SSCCE/MCVEの短い、実行可能な、コンパイル可能なポストをすぐに投稿する。2. while(!kl.getState()){'多分/無限ループを作成できますか? – mKorbel

+0

私はそれを試みることができます。そして目標は、その状態が真実になったときに停止させることです。シフトが押されると、それが計画どおりに機能するかどうかが決まります。 –

+0

whileループがEDTのコンテキスト内で実行されているため、UIが更新されません。詳細は、[Swingの同時実行性](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 [キーバインディングの使用方法](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

答えて

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は別のスレッドで実行されるため、これを行う必要があります。

関連する問題