2016-05-31 2 views
0

그래서 사용자가 Shift 키를 누를 때까지 현재 마우스 위치를 텍스트 상자에 쓰고 마우스 포인터를 놓으면 가장 최근의 마우스 위치가 텍스트 상자의 마지막 텍스트 내가 한 짓을 열심히 :

처음으로 다음과 같은 클래스를 만들었습니다.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

EDT의 컨텍스트 내에서 while 루프가 실행되고있어 UI가 업데이트되지 않습니다. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. [키 바인딩 사용 방법] (URL : http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

답변

0

이 같은 actionPerformed 메소드 내에서 새 스레드를 만들려고 다음의 actionListener가 다른 스레드에서 실행되기 때문에

Thread exampleThread = new Thread() { 

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

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

당신은이 작업을 수행 할 수 있습니다.

관련 문제