MouseListener & KeyListener

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hey, ich habe eine Frage zu dem MouseListener.

Ich hab n JPanel mit zwei Buttons, diese sollen eine Aktion für Rollover kennen (färben sich) und natürlich für das Anklicken.

ich hab ne rollover aktion implementiert auf ein button, aber irgendwie verkorkst er das.

der eine button ändert nie seine farbe, auch wenn ich drüber geh.

der andere ändert seine farbe, sobald ich ins panel gehe! obwohl ich nicht aufm button selbst bin!
Und das witzigste: wenn ich genau auf den button gehe, wird er wieder schwarz!
d.h. irgendwie macht er die aktion immer dann, wenn ich NICHT auf dem button bin, obwohl es ja andersrum sein müsste:

Code:
class bla extends JPanel{

   bla(){
       
         JButton start = new JButton();
         setBounds....

        JButton pause = new JButton();
       setBounds...

       add(start);
       add(pause);

       addMouseListener(this);
   }
}

/* .... */

public void mouseEntered(MouseEvent e){

		 if (e.getSource() == start){
		 	start.setForeground(Data.D_GREEN);
		 }
		 else{
			 pause.setForeground(Color.red);
		 }
	}
	
 	public void mouseExited(MouseEvent e){
		 
		 if (e.getSource() == start){
		 	start.setForeground(Color.black);
		 }
		 else{
			 pause.setForeground(Color.black);
		 }	 
	}

Wieso ist das so seltsam? Liegt das am Panel? Das Layout ist "null" und ich hab die Buttons per setBounds per Hand gelegt.

Ausserdem hab ich ein anderes Problem: Sobald ich auf einen Button klicke, funktioniert mein KEyListener nicht mehr!
Der ist in einem anderen Panel definiert, aber beide Panels liegen im selben Frame!

Wieso verträgt sich das nicht? Was muss ich dagegen tun?

danke 😀
 
Du wirst einzelne Listener an die Buttons hängen müssen, weil event.getSource() afaik IMMER das Panel liefern wird (weil DORT ja der MouseListener dranhängt). Es gäbe vielleicht noch andere Alternativen, aber dazu müßte man das Zeil genauer kennen.
 
und wie geht das mit einzelnen listenern?
ich wüsste nicht, wie ich 2 mouselistener erstellen kann, geschweigedenn wo ich irgend wo nen Namen eingeben kann
für eine Listener-Variable.

Ich kenn nur addMouseLisener(this) ...
 
Hallo,

private MouseListener listener1 = new MouseListener(){

... hier müssen dann die Methoden rein

};

und dann button.addMouseListerner(listener1);


Grüße Oli
 
du brauchst nur 1 mouse listener, aber mußt ihn an die buttons hängen, wenn die buttons reagieren sollen, und nicht dem panel zuweisen. es wäre vielleicht auch besser ein else if einuzbauen und den 2. button auch abzufragen anstatt nur ein else. und ich bevorzuge beim vergleichen auch .equals () anstatt ==, aber es funktioniert beides.


Code:
package de.test;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JPanel;


public class ButtonPanel extends JPanel implements MouseListener {
    
    private JButton btnA = null;
    private JButton btnB = null;    

    
    public ButtonPanel () {
        super ();    
        initComponents ();
        layoutComponents ();
    }    
    
    private void initComponents () {        
        btnA = new JButton ("AAA");
        btnA.addMouseListener (this);
        btnB = new JButton ("BBB");
        btnB.addMouseListener (this);
    }    
    
    private void layoutComponents () {
        this.setLayout (new FlowLayout ());
        this.add (btnA);
        this.add (btnB);
    }

    public void mouseClicked (MouseEvent e) {
    }

    public void mouseEntered (MouseEvent e) {
        if (e.getSource().equals (btnA)){
            btnA.setForeground(Color.GREEN);
         }
         else{
            btnB.setForeground(Color.RED);
         }        
    }

    public void mouseExited (MouseEvent e) {
        if (e.getSource() == btnA){
            btnA.setForeground(Color.BLACK);
         }
         else{
            btnB.setForeground(Color.BLACK);
         }         
    }

    public void mousePressed (MouseEvent e) {
    }

    public void mouseReleased (MouseEvent e) {
    }    
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben