Swing KeyListener implementieren

Endymion

Bekanntes Mitglied
Hi, ich bin irgendwie zu dumm, einen KeyListener richtig zu implementieren. Ich habe an jede KeyListener-Methode einen Breakpoint gesetzt, aber sie wird irgendwie nie aufgerufen.
Was evtl. noch dazugesagt werden sollte: Das komplette JFrame wird von einem JPanel überzogen.
Folgender Code:
Java:
package main;

import game.GameControl;
import game.GameSpace;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import languageListener.LanguageListener;

import utils.LocaleUtils;

public class GUI extends JFrame implements LanguageListener, KeyListener {
	private static final long serialVersionUID = 1L;
	private String pacman = "";
	private String startGame = "";
	private String language = "";
	private boolean[] keys = new boolean[222];
	private  JComboBox<String> languageBox;
	private  JLabel languageLabel;
	private  JButton startButton;
	private  Main main;

	public GUI(Main main) {
		super();
		this.main = main;
		main.addLanguageListener(this);
            addKeyListener(this);
		setBounds(100, 100, 500, 500);
		setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
		initializeHomeScreen();
		initializeStrings();
		pack();
		setVisible(true);
	}

	private void initializeStrings() {
		ResourceBundle languagePack = ResourceBundle
				.getBundle("resources.LanguagePack");
		pacman = languagePack.getString("GUI.pacman");
		startGame = languagePack.getString("GUI.startGame");
		language = languagePack.getString("GUI.language");
		setTitle(pacman);
		languageLabel.setText(language);
		startButton.setText(startGame);
	}

	private void initializeHomeScreen() {
		JPanel languagePanel = new JPanel();
		languagePanel.setLayout(new BoxLayout(languagePanel, BoxLayout.Y_AXIS));
		languageLabel = new JLabel();
		languagePanel.add(languageLabel);
		languageBox = new JComboBox<String>();
		initializeLanguageBox();
		languageBox.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent ae) {
				JComboBox<?> source = (JComboBox<?>) ae.getSource();
				main.setLanguage(LocaleUtils.getLanguage(main,
						(String) source.getSelectedItem()));
				languageBox.setSelectedItem(source.getSelectedItem());
			}
		});
		languagePanel.add(languageBox);
		add(languagePanel);
		startButton = new JButton();
		startButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent ae) {
				main.startGame();
			}
		});
		add(startButton);
	}

	public void initializeLanguageBox() {
		for (Locale locale : main.getSupportetLanguages()) {
			languageBox.addItem(locale.getDisplayLanguage());
		}
	}

	@Override
	public void languageChanged() {
		languageBox.removeAllItems();
		initializeLanguageBox();
		languageBox.setSelectedItem(Locale.getDefault().getDisplayLanguage());
		initializeStrings();
		pack();
	}
	
	public GameSpace initializeGameComponents(GameControl gameControl) {
		GameSpace gameSpace;
		getContentPane().removeAll();
		repaint();
		add(gameSpace = new GameSpace(gameControl));
		pack();
		return gameSpace;
	}
	
	@Override
	public void keyPressed(KeyEvent keyEvent) {
		int keyCode = keyEvent.getKeyCode();
		int[] movementKeys = { KeyEvent.VK_UP, KeyEvent.VK_DOWN,
				KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT };
		keys[keyCode] = true;
		for (int i : movementKeys) {
			if (i != keyCode) {

			}
		}
	}

	@Override
	public void keyReleased(KeyEvent keyEvent) {
		keys[keyEvent.getKeyCode()] = false;
	}

	@Override
	public void keyTyped(KeyEvent keyEvent) {
	}
	
	public boolean[] getKeys() {
		return keys;
	}
	
}
 
Zuletzt bearbeitet:
Java:
this.addKeyListener(this);
sollte schon irgendwo auftauchen^^
 
Meine Browsersuche findet es nicht, daher gehe ich davon aus, dass du den KeyListener hier gar nicht einfügst.
In jedem Fall musst du bedenken, dass die Komponente, die du bestückst, auch den Fokus haben muss (requestFocus()).
 
Hoppla, ich hatte etwas rumprobiert, deshalb war die Codezeile da grade in ner anderen Klasse. Hab sie jetzt wieder im Code eingefügt und den Startpost editiert. Ist im Konstruktor. Das programm geht natürlich trotzdem nicht.
 
Also dass hier geht:
Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class KeyListenerProblem extends JFrame implements KeyListener{
	
	public KeyListenerProblem(){
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(100, 100);
		this.addKeyListener(this);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		System.out.println("kp");
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		System.out.println("kr");
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		System.out.println("kt");
	}
	
	public static void main(String[] args) {
		new KeyListenerProblem();
	}

}

ich dachte erst, das es mit der/dem ContentPane Probleme machen könnte aber das scheints nich zu sein ((

an sonsten wie schon erwähnt Bindings nutzen oder noch schöner, nich vom JFrame erben 😛

Gruß Vanny
 
Hatte ebenfalls mal das Problem bei einem "Spiel" die Steuerung zu implementieren.
Meine Lösung war eine anonyme Klasse zwar wirklich schön, aber es lief.🙂
Java:
Container cp = getContentPane();
		cp.setFocusable(true); // eigentlich sollte sich hier auch mit this. arbeiten
		cp.addKeyListener(new KeyAdapter() {

			@Override

			public void keyPressed(KeyEvent e)
			{
				int input=e.getKeyCode();
				if(input==KeyEvent.VK_RIGHT) {
				}
				if(input==KeyEvent.VK_LEFT) {
				}
				if(input==KeyEvent.VK_UP) {
				}
				if(input==KeyEvent.VK_DOWN) {
				} // weitere Abfragen nach Tastendruck...



			}
			public void keyReleased(KeyEvent e){
                          //ggf. implementieren
			}
			public void keyTyped(KeyEvent e) {
			  //ggf. implementieren
                        }


		});
               ...
Ganz am Ende dann cp.requestFocus(); oder this.requestFocus();🙂
 

Zurück
Oben