AdjustmentListener vs. KeyListener

slang

Grünschnabel
Hi,

habe folgendes Problem:

Habe einen JFrame auf dem ich einen KeyListener laufen lassen möchte, der mir PageUp und PageDown abfängt, das funktioniert auch soweit. Allerdings hab ich auch eine JScrollBar mit einem AdjustmentListener in diesem JFrame, funktioniert soweit auch.

Wenn der AdjustmentListener aktiviert ist, kommen keine Events mehr bei dem KeyListener an. Wie kann ich die beide parallel laufen lassen, so dass der eine sich nur um die Keys kümmert und der andere (Adjustment) nur, wenn er mit der Maus verändert wird. Hab da was gelesen, dass es mit consume() gehen könnte, kapier aber nicht ganz wie...

MfG
 
Zuletzt bearbeitet:
Hallo slang,

ein Listener funktioniert in Swing nur, wenn diejenige Komponente den Focus hat. Das ist beim KeyListener besonders wichtig. Sobald du die ScrollBar mit der Maus tätigst hat sie nun den Focus. Das heißt der KeyListener wird nicht mehr greifen.

Eine Möglichkeit wäre, du setzt die ScrollBar setFocusable(false). Eine zweite Möglichkeit du registrierst den KeyListener an mehrere Komponenten, dann ist die Chance das der KeyListener reagiert größer. Oder du setzt Anwendungsglobale Hotkeys.

Java:
import java.awt.BorderLayout;
import java.awt.event.*;

import javax.swing.*;

public class JScrollBarDemo extends JFrame {
	private int startValue = 0;

	private int viewableSize = 500;

	private int min = 0;

	private int max = 1000;

	private JTextArea ta = new JTextArea();

	private JScrollPane sp = new JScrollPane(ta);

	private JScrollBar sb = new JScrollBar(JScrollBar.VERTICAL, startValue,
			viewableSize, min, max);

	public JScrollBarDemo() {
		super("Demo");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(320, 480);

		sb.addAdjustmentListener(new AdjustmentListener() {
			public void adjustmentValueChanged(AdjustmentEvent e) {
				ta.append("AdjustmentListener is activ\n");
			}
		});
		sb.setFocusable(false);
		sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

		ta.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == e.VK_PAGE_UP)
					ta.append("PageUp\n");
				else if (e.getKeyCode() == e.VK_PAGE_DOWN)
					ta.append("PageDown\n");
			}
		});

		this.add(sp, BorderLayout.CENTER);
		this.add(sb, BorderLayout.EAST);

		this.setVisible(true);
	}

	public static void main(String args[]) {
		new JScrollBarDemo();
	}
}

Für Anwendungsglobale Hotkeys siehe hier:
http://www.tutorials.de/forum/java/242472-abbruch-mit-escape.html


Vg Erdal
 
Zurück