Mouse event und exit on close

Alumiso

Mitglied
Hallo JAVA´ler,
habe da ein kleines Problem und kan es auch nach langer rechersche nicht lösen.
Möchte gerne ein fenster schliessen wenn der Benutzer die Maus bewegt.



Java:
package fullscreen;

import java.awt.*;
import java.awt.event.*;

import javax.print.DocFlavor.URL;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
//import com.sun.image.codec.jpeg.JPEGCodec;
import java.io.*;

public class fenster {
  JFrame frame;
    
    public fenster() {
	frame = new JFrame("Test");
	
	Toolkit tk = Toolkit.getDefaultToolkit();
	int xSize = ((int) tk.getScreenSize().getWidth());
	int ySize = ((int) tk.getScreenSize().getHeight());
	frame.setUndecorated(true);  
	frame.setSize(xSize,ySize);
	frame.show();
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }

    public static void main(String[] args) {
	fenster app = new fenster();
	
	//if ( mouseMove||keyPress ){
	  //  JFrame.EXIT_ON_CLOSE;
	}
    }

Zu beachten ist hierbei, das das Fenster "frame.setUndecorated(true);" -also keinerlei Ramen etc.
haben soll, weil es sich auf die Bilderpräsentation stöhrend ausweirken würde. Normalerweise würde man ja auf ein kleines Kreutz rechts oben klicken und das fenster, bzw die Anwendung würde wieder schliessen. Da aber die GUI Elemente reduziert sind, möchte ich es mit einer Mausbewegung schliessen wie bei einem Screensaver.

Wie also bekomme ich das realisiert?
Viele Grüße
Alumiso
 
Zuletzt bearbeitet von einem Moderator:
MouseMotionListener auf die ContentPane des JFrames - und wenn sich die Maus bewegt (, also mouseMoved(...) ein Event feuert,) dann entweder deinFrame.dispose(); oder System.exit(0); aufrufen (oder evtl. nur das Fensterverkleinern, was du eben willst).
 
leider weis ich nicht, wie ich das (eincoden) soll.Da gabs schon zu viel infos bei Oracle aber für einen Anfängerwie mich nicht zu durchschauen. Wie mach ich´s?
 
Den JAVA: 14.2.2 Mausklicks und Mausbewegungen musst du auf die contentPane des JFrames setzen. In dem Beispiel von dem Link wird der JFrame benutzt, laut GUI-Programmierer musst du diesen allerdings auf die ContentPane setzen.

Anschließend musst du in der MouseMoved Methode einfügen. Diese ist Pflicht, da du auch das Interface implementieren musst. Ein Interface ist eine Vereinbarung, dass best. Methoden in einer Klasse enthalten sein müssen.

In dieser Methode, die du einfügen musst, musst du dann entsprechend weiterverfahren. Also das Programm schließen o.ä. siehe oben GUI-Programmierer
 
Sorry wo ist denn hier das uminöse ContentPane?

Java:
package fullscreen;
 
import java.awt.*;
import java.awt.event.*;
 
import javax.print.DocFlavor.URL;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
//import com.sun.image.codec.jpeg.JPEGCodec;
import java.io.*;
 
public class fenster {
  JFrame frame;
    
    public fenster() {
    frame = new JFrame("Test");
    
    Toolkit tk = Toolkit.getDefaultToolkit();
    int xSize = ((int) tk.getScreenSize().getWidth());
    int ySize = ((int) tk.getScreenSize().getHeight());
    frame.setUndecorated(true);  
    frame.setSize(xSize,ySize);
    frame.show();
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }
 
    public static void main(String[] args) {
    fenster app = new fenster();
    
    //if ( mouseMove||keyPress ){
      //  JFrame.EXIT_ON_CLOSE;
    }
    }


Wo kommt das rein?
 
Hi,

hab dir das mit der ContentPane sowie dem implementieren des Interfaces und dem einfügen der dazugehörigen Methoden mal gemacht. Denke sollte so passen, ist natürlich noch nicht fertig, das Programm beendet sich nämlich noch nicht. Aber ein bisschen willst du dich sicherlich auch noch damit spielen 🙂

Außerdem habe ich deine Methode frame.show() mal ausgeklammert und stadtdessen frame.setVisible(true); verwendet. show() ist deprecated und sollte nicht mehr verwendet werden. Warum etc. entnimmst du der API falls es dich interessiert.
Java:
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class Test implements MouseMotionListener{
  JFrame frame;
    
    public Test() {
    frame = new JFrame("Test");
    
    Toolkit tk = Toolkit.getDefaultToolkit();
    int xSize = ((int) tk.getScreenSize().getWidth());
    int ySize = ((int) tk.getScreenSize().getHeight());
    frame.setUndecorated(true);  
    frame.setSize(xSize,ySize);
    frame.setVisible(true); //.show() sollte seit 1.5 nicht mehr verwendet werden.
    
    frame.getContentPane().addMouseMotionListener(this);
    
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }
 
    public static void main(String[] args) {
    	Test app = new Test();
    
    //if ( mouseMove||keyPress ){
      //  JFrame.EXIT_ON_CLOSE;
    }

	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {
		
		
	}
    }
 
@Fab1: Ja, ist ja ganz schön, was du da lieferst, aber es langt dann auch wieder. Schließlich sollte der TO schon in der Lage sein nach ContentPane zu googeln. (--> Eigeninitiative)
 
Möchte gerne ein fenster schliessen wenn der Benutzer die Maus bewegt.
Wirklich? Ja wenn das sein muss: MouseListener hinzufügen: mouseMoved(...){xxx.setVisible(false);}
und wenns "nicht aufgeht" dann gehts vielleicht auf, du bewegst nur die maus schon beim kompilieren und es schließt schon wieder
 
hier mal ein funktionierendes Bsp...mit einem kleinen hässlichen Workaround..
Java:
import java.awt.event.*;
import javax.swing.*;

public class fenster implements MouseMotionListener, KeyListener {
	JFrame frame;
	boolean firstTime = true;

	public fenster() {
		frame = new JFrame("Test");

		// Toolkit tk = Toolkit.getDefaultToolkit();
		// int xSize = ((int) tk.getScreenSize().getWidth());
		// int ySize = ((int) tk.getScreenSize().getHeight());
		// frame.setSize(xSize, ySize);
		frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
		frame.setUndecorated(true);

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addMouseMotionListener(this);
		frame.addKeyListener(this);
		frame.setVisible(true);

	}

	public static void main(String[] args) {
		fenster app = new fenster();

	}

	@Override
	public void mouseDragged(MouseEvent e) {

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		if (!firstTime) {
			frame.dispose();
		} else {
			firstTime = false;
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent e) {
		frame.dispose();

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
 

Neue Themen


Zurück
Oben