2016-05-31 11 views
0

Also habe ich eine Taste, die gedrückt wird, um die aktuelle Mausposition in ein Textfeld zu schreiben, bis der Benutzer die Umschalttaste drückt, dann stoppt und die letzte Mausposition als verlässt der endgültige Text in der Textbox. Heres, was ich getan habe:

Zuerst erstellt die folgende Klasse.Java - KeyListener funktioniert nicht/Mausposition nicht gelesen

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; 
    } 
} 

Dann in meiner "Haupt" Klasse habe ich den folgenden Code.

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()); 
      } 
     } 
    }); 
} 

Ich habe dann natürlich das Textfeld zu einem JPanel und es ist alles richtig angezeigt wird, aber wenn ich die Track-Taste nichts passiert klicken. Ich kann sagen, dass es in die Schleife eintritt, aber kein Text wird in der Textbox angezeigt und das Drücken von Shift unterbricht nicht die Schleife.

+0

1. für bessere Hilfe eher nach einem SSCCE/MCVE, kurz, runnable, compilable, 2. 'while (! Kl.getState()) {' vielleicht/kann Endlosschleife erstellen? – mKorbel

+0

Ich kann das versuchen. Und das Ziel wäre, dass es aufhört, wenn sein Zustand wahr wird, was, wenn es wie geplant funktionieren würde, wäre, sobald Shift gedrückt wird. –

+0

Die while-Schleife wird im Kontext des EDT ausgeführt, wodurch verhindert wird, dass die Benutzeroberfläche aktualisiert wird. Weitere Informationen finden Sie unter [Parallelität in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). Es ist vielleicht besser, sich die [Wie verwendende Tastenbelegungen] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) anzusehen. – MadProgrammer

Antwort

0

Versuchen Sie einen neuen Thread in der actionPerformed Methode wie folgt zu machen:

Thread exampleThread = new Thread() { 

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

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

Sie haben, dies zu tun, weil die Action in einem anderen Thread ausgeführt wird.