Difference between MouseEvent and ActionEvent

A

abschiedsstein

Gast
Hi,
Ich habe gestern angefangen eine Swing Application zu schreiben. Als ich einen Menueintrag zum schließen des Programms einbauen wollte, bin ich auf etwas merkwürdiges gestoßen. Bitte werft einen Blick auf den folgenden Quelltext:

Java:
import java.awt.EventQueue;


public class MainWindow {

	private JFrame frame;
	private JMenu mnMain;
	private JMenuItem mntmQuit;
	private JMenu mnManage;
	private JMenuItem mntmAddTable;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow window = new MainWindow();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public MainWindow() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		mnMain = new JMenu("Main");
		menuBar.add(mnMain);

		// Here comes the relevant part!
		mntmQuit = new JMenuItem("Quit");
		mntmQuit.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.exit(0);
			}
		});
		/*
		mntmQuit.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
				
			}
		});*/
		mnMain.add(mntmQuit);
		
		mnManage = new JMenu("Tables");
		menuBar.add(mnManage);
		
		mntmAddTable = new JMenuItem("Add Table");
		mnManage.add(mntmAddTable);

	}
	public static void close(){
		System.exit(0);
	}
}

Ich habe versucht das Programm mithilfe eines MouseListeners und mit einem EventListener zu beenden. Der auskommentierte Quelltextteil bewirkt, was er soll. Der zurzeit nicht auskommentierte bewirkt jedoch nicht das schließen des Programms, wenn man den Menueintrag anklickt.
Ich frage mich: WARUM?
Vllt kann mir jemand helfen.
Vielen Dank
 
S

SlaterB

Gast
eine GUI ist ein komplexes Gebilde verschiedener Layer,
Komponenten sind manchmal bisschen echter, manchmal nur abstrakte Beschreibungen von dem was gemalt wird,
wer wo wann Listener-Ereignisse bekommt und wie verarbeitet ist kompliziert und muss dich im Detail nicht unbedingt interessieren,

hier kannst du akzeptieren, dass es für aufgeklappte Menüs keine direkte MouseListener-Verarbeitung wie bei JPanel gibt,
sondern das alles intern passiert und bei Auswahl eines Menüpunkts der dortige ActionListener informiert wird,
ok?

dass man einen MouseListener adden kann muss nicht unbedingt viel heißen, kann zur Vereinfachung in Basisklassen stehen (gar in Component selber) ohne überall eine theoretische oder vor allem sinnvolle Nutzung zu haben
 
Zuletzt bearbeitet von einem Moderator:

RySa

Bekanntes Mitglied
Ich kenne "das Innenleben" der Componenten nicht, daher vertraue ich auch einfach mal dem SlaterB :)

Eigentlich ist es aber auch üblich den "Buttons" einen ActionListener hinzuzufügen und nicht einen MouseAdapter(), obwohl diese auch mit der Maus "geclickt" werden. Die Events werden aber unabhängig davon ob es mit der Mous angeclickt wurde, oder mit Enter (man kann ja mit Tab zwischen den Buttons springen). Daher weiß der Button gar nicht ob das die Maus war, weiß nur, dass er "gedrückt" wurde. Und genau dafür ist der ActionListener zuständig.
 
Zuletzt bearbeitet:
A

abschiedsstein

Gast
Ich hätte hier wohl früher nochmal lesen sollen, dann wäre ich schneller beim Ergebnis gelandet. Ich habe jedoch das gleiche festgestellt: Wenn man schlicht MousePressed verwendet, ist man auf der sicheren Seite.
 

Ähnliche Java Themen

Neue Themen


Oben