MouseEvent erreicht den Zustand "keine Taste gedrückt" nicht

MrCastle

Mitglied
Hi Community,

mal wieder eine Frage zu Java, dieses Mal zwecks Mausereignisbehandlung. Ich versuche mich gerade an einem Spiel mit JOGL und möchte nun Mausereignisse abfangen. Funktioniert auch bis zu einem gewissen Punkt ganz gut, leider bemerkt der Listener nur nicht, dass ein Mausbutton "released" wurde. Ich bin mir gerade nicht sicher wo sich ein Fehler eingeschlichen haben könnte, hier der notwendige Quelltext:

Code:
public class SgameApplication implements KeyListener, MouseListener{

	private Logger logger = null;
	private Game defaultGame = null;
	private int keyState = 0;  // Welcher Buchstabe ist gedrückt
	
	public MouseEvent mouse;
	private GLCanvas canvas;
	
	private static Animator animator;
	// Fenster
//	private JOGLFrame frame = new JOGLFrame("Shipgame");
	private Frame frame = new Frame("Shipgame");
	
	/**
	 * Standardkonstruktor
	 */
	public SgameApplication(){
		
		// Logging
		logger = Logger.getLogger("game logger");
    	String pattern = "%d{ISO8601} [%p] %m %n"; 
    	PatternLayout layout = new PatternLayout(pattern);
    	
    	try{
	        FileAppender consoleAppender = new FileAppender(layout, "sgame.log");
	        logger.addAppender( consoleAppender );
	        logger.setLevel(Level.ALL);
    	} catch(Exception e){
    		e.printStackTrace();
    	}
    	
    	// Fensterelemente entfernen
    	frame.setUndecorated(true);
    	
    	// Hier Auflösung auslesen
    	GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    	GraphicsDevice gd = ge.getDefaultScreenDevice();
    	DisplayMode dm = gd.getDisplayMode();
    	
    	int w = dm.getWidth();
    	int h = dm.getHeight();
    	
    	defaultGame = new Game(this, w, h);
    	
		// JOGL Code
		canvas = new GLCanvas();
		canvas.addGLEventListener(defaultGame);
		canvas.addMouseListener(this);
		frame.add(canvas);
		animator = new Animator(canvas);
		// Jogl Code Ende
		
		frame.setBounds(0, 0, w, h);
		frame.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				animator.stop();
				System.exit(0);
			}
		});
		frame.setVisible(true);
		animator.start();
	}
	
	/**
	 * Main Methode.
	 * @param args
	 */
	public static void main(String[] args) {
		SgameApplication app = new SgameApplication();
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		this.keyState = e.getKeyCode();
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		this.keyState = 0;
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	public int getKeyState(){
		return keyState;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub		
		mouse = e;
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		mouse = e;
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		mouse = e;
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		mouse = e;
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		mouse = e;
	}
	
}

In der aufgerufenen "Game"-Klasse frage ich den Status dann folgendermaßen ab:

Code:
switch (gameApp.mouse.getButton()) {
	        case MouseEvent.BUTTON1:
	        	break;
	        case MouseEvent.BUTTON2:
	        	break;
	        case MouseEvent.BUTTON3:
	        	break;
	        case MouseEvent.NOBUTTON:
	        	break;
	        default:
	        	break;
	      }
Sobald jedoch einmal ein Status erreicht wurde, wird er erst wieder bei einem Mausklick geändert und passt sich nicht an den wirklichen Status an. Der Status "NOBUTTON" wird also nur erreicht, bevor eine Maustaste gedrückt wurde.

Die Einrückung hats etwas zerrissen, nicht benötigter Code wurde entfernt.

Vielen Dank für Vorschläge im Voraus

MrCastle
 
Was genau erwartest du denn? Ich meine bei einem mouse released gibt er dir auch immer den Button mit zurück, der vorher gedrückt war und nicht NO BUTTON. Bei mir gerade wurde der NOBUTTON Status nur gesetzt, wenn ich zum Beispiel in die Titelleiste geklickt hatte, ansonsten hatte ich immer einen Button zurück geliefert bekommen.

Gruß
Der Wolf
 
Ich denke das Problem hat nichts mit released etc. zu tun, sondern eher damit dass du in den Event-Funktionen mouseExited und mouseEntered auch "mouse=e" geschrieben hast. Diese werden nämlich ausgelöst, wenn die Maus ein Element betritt oder verlässt, und bei diesen Events ist es ja nicht zwingend notwendig, dass eine Maustaste gedrückt ist.
Lösch einfach mal das "mouse=e;" in den beiden Funktionen und du wirst kein NOBUTTON mehr haben.
 
Was genau erwartest du denn? Ich meine bei einem mouse released gibt er dir auch immer den Button mit zurück, der vorher gedrückt war und nicht NO BUTTON. Bei mir gerade wurde der NOBUTTON Status nur gesetzt, wenn ich zum Beispiel in die Titelleiste geklickt hatte, ansonsten hatte ich immer einen Button zurück geliefert bekommen.

Gruß
Der Wolf

Hi und danke für die Antworten. Ich erwarte, dass bei der Betätigung eines Mausbuttons nicht der gleiche Status erhalten bleibt, auch wenn der Button nicht mehr gedrückt wurde. Ich will ja nur einen Klick wahrnehmen und nicht mehr. Vielleicht ist das aber der falsche Ansatz.

Ich denke das Problem hat nichts mit released etc. zu tun, sondern eher damit dass du in den Event-Funktionen mouseExited und mouseEntered auch "mouse=e" geschrieben hast. Diese werden nämlich ausgelöst, wenn die Maus ein Element betritt oder verlässt, und bei diesen Events ist es ja nicht zwingend notwendig, dass eine Maustaste gedrückt ist.
Lösch einfach mal das "mouse=e;" in den beiden Funktionen und du wirst kein NOBUTTON mehr haben.

Das war nur eine temporäre Spielerei, vorher hatte ich es nur in den anderen Methoden und diversen Kombinationen ohne "Entered" und "Exited", hat leider keine Auswirkung. Außerdem möchte ich ja den "NOBUTTON" Status erreichen, da ich im Grunde bei einem Klick eine entsprechende Anreihung von Aktionen ausführen möchte.


e: OK ich glaube ich habe meinen Denkfehler gefunden :-S
Die entsprechenden Methoden "mouseClicked" etc. werden ja bei einem Klick nur einmal ausgeführt... Da muss ich ansetzen, getButton gibt mir ja offensichtlich nur den letzten gedrückten Button zurück.
OK ich denke damit hat sichs erledigt :D Werde es gleich mal testen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück