Mouse + Keylistener

Underfaker

Bekanntes Mitglied
Hallo zusammen,

besteht die Möglichkeit in Java für eine bestimmte Komponente zwei Listener so zu implementieren, dass man beide Exvents abfragen kann.
Mir geht es darum die Aktion "Mausrad rotieren" nur dann abzuarbeiten wenn gleichzeitig Strg gedrückt wird.

Hat da jemand etwas Brauchbares?

Besten Dank im voraus
 

Joose

Top Contributor
Klar geht das :)

Erstelle eine Klasse die beide Listener implementiert und füge ein(!) Objekt dieser Klasse als Key UND als MouseListener hinzu!

Wenn du nun STRG drückst setze einfach ein Flag, und frage diese Flag ab wenn das Mouserad gedreht wird.
 

Underfaker

Bekanntes Mitglied
Danke für den Hinweis.

Meine Klasse sieht nun so aus:
Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;


public class KeyMouseListener implements KeyListener, MouseWheelListener 

{
	
	PanelForCoordinate panel;
	
	public KeyMouseListener(PanelForCoordinate panel)
	
	{
		this.panel = panel;
	}
	
	boolean flag = false;

	@Override
	public void mouseWheelMoved(MouseWheelEvent e) 
	{
		if (flag)
		{
			int scrollType = e.getWheelRotation();
			if (scrollType < 0 )
			{
				int bla = panel.getSlider().getValue();
				panel.getSlider().setValue(++bla);
			}
			else
			{
				int bla = panel.getSlider().getValue();
				panel.getSlider().setValue(--bla);
			}
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {
		System.out.println(e);
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == 17)
			flag = true;
		else
			flag = false;
		System.out.println("bla");
	}

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

}
In der Klasse wo ich diesen Listener setze, ist ein Panel und dieser Slider der beeinflusst werden soll.
Wenn ich bei dem WheelListener die if-Abfrage weg mache, führt er den beinhalteten Code aus.
Aber das Programm reagiert in keinster Weise auf iregndwelche Tastendrücke.
Gibt es auch dafür eine Idee?
 

Joose

Top Contributor
Schaut schon mal gut aus, wie setzt du denn den Listener? (zeige beide Stellen).

Soweit ich weiß wird das keyPressed Event nur ausgelöst von Tasten die "druckbare Zeichen schreiben", du müsstest ein keyDown Event verwenden.
 

Underfaker

Bekanntes Mitglied
Zeile 37 und 38:
Java:
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class PanelForCoordinate extends JPanel  implements ChangeListener{

	private Coordinate coordinateSystem;
	private JSlider slider;
    public PanelForCoordinate(int size)
    
    {
    	try {
			UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
		} catch (UnsupportedLookAndFeelException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	this.setSize(size, size);
    	slider = new JSlider(1, 50, 25);
    	KeyMouseListener keyMouseListener = new KeyMouseListener(this);
    	this.addMouseWheelListener(keyMouseListener);
    	this.addKeyListener(keyMouseListener);
    	SwingUtilities.updateComponentTreeUI(slider);
        slider.addChangeListener(this);
        SwingUtilities.updateComponentTreeUI(slider);
        setLayout(new BorderLayout());
        add(slider, BorderLayout.SOUTH);
        coordinateSystem = new Coordinate(size);
        add(coordinateSystem, BorderLayout.CENTER);
    }
    
    public JSlider getSlider()
    
    {
    	return slider;
    }
    
	@Override
	public void stateChanged(ChangeEvent e) {
		double factor = (double)((JSlider)e.getSource()).getValue()/50;
		coordinateSystem.setFactor(factor*16);
		coordinateSystem.repaint();
		this.repaint();
	}
	
	
}

In einem anderen Beispiel hab ich einem Button das übergeben:
Java:
btnNewButton.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				System.out.println(e);
			}
		});
Der reagiert auch auf Tastendrucke
 

Underfaker

Bekanntes Mitglied
Könnte es damit zusammenhängen, dass es dem Panel hinzugefügt wird?
Das scheint mir nämlich allgemein problematisch zu sein, wenn man ein Panel auf einem Panel hat.
 

Joose

Top Contributor
Der reagiert auch auf Tastendrucke

Wie gesagt, es gibt 3 verschiedene Events bei Keys

  • keydown - wird ausgelöst sobald die taste gedrückt wird (wiederholt sich solange die taste gedrückt bleibt)
  • keypress - wird ausgelöst wenn eine taste mit druckbaren zeichen gedrückt (und auch wieder losgelassen wurde)
  • keyup - wird ausgelöst sobald die taste losgelassen wird

Natürlich musst du auch aufpassen welches Control den Fokus (bzw. Keyboard Focus hat).
 

Underfaker

Bekanntes Mitglied
Ja kannst du mir dann vielleicht das beantworten?
Da die Klasse KeyListener nur die Methoden keyTyped, keyPressed und keyReleased kennt, weiß ich nicht wie ich keyDown anbinde.
Und wie sorge ich dafür, dass wenn ich einem Panel diesen Listener übergebe und das Panel dann auf ein Frame packe, dass dann der Panel-listener reagiert?
Mit dem Satz "welches Control den Focus hat", kann ich so leider nichts anfangen.

Danke schon mal
 

Underfaker

Bekanntes Mitglied
Oha, das war ja einfach.
Hab in dem Frame gesagt, dass das Panel focusable sein soll und schon geht es, yeha

Jetzt fehlt nur noch das wenn ich einmal auf Strg gedrückt habe, dass es dann auch ohne den Tastendruck geht, also benötige ich wohl kDown.

Kannst du mir das mit dem KeyDown zeigen?
Ich habe es zwar nun so gelöst, das bei keyRelesed einfach wieder ein false gesetzt wird, allerdings wird - wie du sagst - jetzt der keyPressed ununterbrochen ausgeführt, das könnte man sich ja sparen.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Wie du geschrieben hast, stellt das KeyListener Interface (nicht Klasse!!) 3 Methoden bereit. Eine davon enstpricht dem drücken einer Taste, eine dem loslassen einer Taste und eine entsprichten dem drücken+loslassen einer Taste (begrenzt auf druckbare Zeichen).
 

Underfaker

Bekanntes Mitglied
Ja wie du schon festgestellt hast, hatte ich das schon festgestellt(!). Oo

Naja es läuft auf jeden Fall jetzt so wie ich es wollte, das mit dem Focus ist natürlich schwierig, da er immer wo anders zu landen scheint aber wird schon.

Danke für die Hilfe.
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ja wie du schon festgestellt hast, hatte ich das schon festgestellt(!). Oo

Ging für mich nicht klar hervor :oops:

Naja es läuft auf jeden Fall jetzt so wie ich es wollte, das mit dem Focus ist natürlich schwierig, da er immer wo anders zu landen scheint aber wird schon.

Danke für die Hilfe.

Naja entweder suchst du über Google einen Blogbeitrag der das Thema Focus Handling in Swing behandelt, oder du testest es selber ausgiebig. Generell muss man bei Listener "Geschichten" genau in der Doku lesen in welcher Reihenfolge die abgearbeitet werden und von welchen Komponenten da dann reagiert werden kann usw.
 

Harry Kane

Top Contributor
@TE:
Wenn es nur darum geht, dass eine Mausrad-Aktion nur dann ausgeführt wird, wenn die Ctrl-Taste gedrückt wird, warum fragst du nicht einfach
Code:
mouseEvent.isCtrlDown()
ab ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JLabel aus einem Mouse- bzw. KeyListener aendern AWT, Swing, JavaFX & SWT 2
G mouse events AWT, Swing, JavaFX & SWT 6
N Mouse methods AWT, Swing, JavaFX & SWT 10
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
M Java FX Mouse over AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
B GUI mit Mouse Touch AWT, Swing, JavaFX & SWT 27
S Mouse Events in einer sortierten JTable unterscheiden AWT, Swing, JavaFX & SWT 18
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
H Rechteck via Mouse bewegen AWT, Swing, JavaFX & SWT 2
H Java Robot mouse funktioniert nur auf Notebook nicht. AWT, Swing, JavaFX & SWT 4
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Mouse Track Lisetner AWT, Swing, JavaFX & SWT 2
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
M Mouse Wheel Listener reagiert mehrmals AWT, Swing, JavaFX & SWT 5
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
H fwststellen, ob sich Mouse auf dem Rand befindet AWT, Swing, JavaFX & SWT 3
Dit_ Buttons Mouse-Over Effekt AWT, Swing, JavaFX & SWT 8
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
raptorrs JFrame nur anzeigen, solange die Mouse gedrückt ist AWT, Swing, JavaFX & SWT 3
G JButton Mouse Over Text AWT, Swing, JavaFX & SWT 2
T Mouse Popup AWT, Swing, JavaFX & SWT 2
M Bug; Swing-Worker, Progressbar und Mouse AWT, Swing, JavaFX & SWT 22
R Mouse Wheel funktioniert nicht im JDialog ! AWT, Swing, JavaFX & SWT 4
T mouse-event auf jcolorchooser AWT, Swing, JavaFX & SWT 2
M eine zeichnen beim mouse ziehen AWT, Swing, JavaFX & SWT 8
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
S Rechteck per Mouse aufziehen AWT, Swing, JavaFX & SWT 7
S Mouse-Event in JTable AWT, Swing, JavaFX & SWT 3
K Mouse Position nach Drag und Drop? AWT, Swing, JavaFX & SWT 4
M Grafikobjekte mit Mouse auswählen und verschieben AWT, Swing, JavaFX & SWT 2
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben