KeyListener richtig implementieren

Maicus

Mitglied
Guten Abend,
ich habe ein Problem ich versuche eine Art Engine zuschreiben die Grafik verarbeitet das geht bis jetzt ganz gut.

Ich kann sagen das ich panels erstellen kan usw. in einfachem Deutsch.
Mein Problem sind nun die KEyListener.
Wie soll oder besser gesagt kann ich die Implementieren.
Ich muss ja individuell entscheiden wass gemacht werden soll wenn irgendwas passiert. Und das ist schwierig.
Bei der Grafik verwende ich einfach verkettete Listen um diese anzuzeigen. Aber den KeyListener müsst ich eigentlich in die Hauptklasse schreiben, dann hab ich aber keinen zugriff Auf die JPanels und kann diese nicht als KeyListener hinzufügen.

Ich weiß nicht wie man des normalerweise löst, ob man es schafft den KeyListener in die Engine zu packen oder ob man es schafft das man den Keylistener nicht irgendwo hinzufügen muss. Ich weiß nicht was die Lösung ist.
Und hoffe das Ihr was in diesem Thema wisst.

Hier ist noch der Code:

[Java]

import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;


public class Win4 implements KeyListener
{
Leinwand canvas;
int Feld[][] = new int[7][6];//Rot = 1 //Gelb =2 //Unbelegt = 0
String Spieler;
boolean fertig;
int zeigerReihe;

Win4()
{
canvas = new Leinwand("4 Gewinnt", 505, 375);
canvas.neueFlaeche(300, 350, "Mitte");
canvas.neueFlaeche(150, 350, "Rechts");
canvas.neueFlaeche(450, 50, "Oben");


zeigerReihe = 4;
Spieler = "Gelb";

canvas.ladeBild("Hintergrund", "images/background.png");
canvas.ladeBild("Gelb", "images/YCoin.png");
canvas.ladeBild("Rot", "images/RCoin.png");
canvas.ladeBild("Balken", "images/balken.png");
canvas.ladeBild("Seite", "images/seite.png");
canvas.ladeBild("RotZ", "images/RZ.png");
canvas.ladeBild("GelbZ", "images/GZ.png");

canvas.bildDazu("Mitte", "Hintergrund", 0, 0);
canvas.bildDazu("Oben", "Balken", 0, 0);
canvas.bildDazu("Rechts", "Seite", 0, 0);


for(int i=0; i<6; i++)
{
for (int q = 0; q<7; q++)
{
canvas.bildDazu("Mitte", "Gelb", q*50, i*50);
}
}
canvas.bildWeg("Mitte", "Gelb");
zeigerSetzen();
}

public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
System.out.println("KeyPressed");
if(code == KeyEvent.VK_RIGHT&&zeigerReihe>7)
{
zeigerReihe++;
zeigerSetzen();
}
}
public void keyReleased(KeyEvent e)
{
System.out.println("KeyR");

}
public void keyTyped(KeyEvent e)
{
System.out.println("KeyT");
}


public void muenzeHinzufuegen(int row, String player)
{
int zeile = 0;
int reihe = row-1;
while(zeile<5&&Feld[reihe][zeile] != 0)
{
zeile++;
}

if(player == "Gelb")
{
Feld[reihe][zeile] = 2;
canvas.bildDazu("Mitte", "Gelb", reihe*50, 250-(zeile*50));
}
else if(player == "Rot")
{
Feld[reihe][zeile] = 1;
canvas.bildDazu("Mitte", "Rot", reihe*50, 250-(zeile*50));
}
else
{
System.out.println("Falscher name");
}


}
void zeigerSetzen()
{
canvas.bildWeg("Oben", "RotZ");
canvas.bildWeg("Oben", "GelbZ");
if(Spieler.equals("Gelb"))
{
canvas.bildDazu("Oben", "GelbZ", (zeigerReihe*50)-50, 0);
}
else if(Spieler.equals("Rot"))
{
canvas.bildDazu("Oben", "RotZ", (zeigerReihe*50)-50, 0);
}
else
{
System.out.println("Falsche eingabe String player zeiger Setzen");
}
}
}
[/Java]


[Java]


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.border.TitledBorder;
import java.io.*;
import javax.imageio.*;
import java.net.*;

interface Pictures
{
EinfachVerketteteListe list = new EinfachVerketteteListe();
}

public class Leinwand extends JFrame
{
ShowCanvas Center, Left, Right, Top, Bot;
{}


Leinwand(String Titel, int breite, int hoehe)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(Titel);
setSize(breite, hoehe);
setResizable(false);
setVisible(true);


}

public JPanel getPanel()
{
return Center;
}

public void neueFlaeche(int height, int width, String position)
{
if(position.equals("Mitte"))
{
Center = new ShowCanvas(height, width);
add(Center, BorderLayout.CENTER);
}
else if(position.equals("Rechts"))
{
Right = new ShowCanvas(height, width);
add(Right, BorderLayout.LINE_END);
}
else if(position.equals("Links"))
{
Left = new ShowCanvas(height, width);
add(Left, BorderLayout.LINE_START);
}
else if(position.equals("Oben"))
{
Top = new ShowCanvas(height, width);
add(Top, BorderLayout.PAGE_START);
}
else if(position.equals("Unten"))
{
Bot = new ShowCanvas(height, width);
add(Bot, BorderLayout.PAGE_END);
}
validate();
repaint();
}
public void ladeBild(String name, String pfad)
{
Pictures.list.addLast(new ImageManager(name, pfad));
}
public void bildDazu(String position, String bild, int x, int y)
{
if(position.equals("Mitte"))
{
Center.addImage(bild, x, y);
}
else if(position.equals("Rechts"))
{
Right.addImage(bild, x, y);
}
else if(position.equals("Links"))
{
Left.addImage(bild, x, y);
}
else if(position.equals("Oben"))
{
Top.addImage(bild, x, y);
}
else if(position.equals("Unten"))
{
Bot.addImage(bild, x, y);
}
}

public void bildWeg(String position, String name)
{
if(position.equals("Mitte"))
{
Center.delete(name);
}
else if(position.equals("Rechts"))
{
Right.delete(name);
}
else if(position.equals("Links"))
{
Left.delete(name);
}
else if(position.equals("Oben"))
{
Top.delete(name);
}
else if(position.equals("Unten"))
{
Bot.delete(name);
}
}
}

class ImageManager
{
String name;
Image icon;
int width, height;
int x, y;

ImageManager(String name, String path)
{
icon = new ImageIcon(this.getClass().getResource(path)).getImage();
this.name = name;
}
ImageManager(String bild, int nx, int ny)
{
icon = Pictures.list.findPic(bild);
x = nx;
y = ny;
this.name = Pictures.list.findObj(bild).getName();
}

public Image getImage()
{
return icon;
}

public String getName()
{
return name;
}

public int getY()
{
return y;
}

public int getX()
{
return x;
}

}

class ShowCanvas extends JPanel
{
EinfachVerketteteListe BilderReihenfolge;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
width = nwidth;
height = nheight;
setSize(width, height);
BilderReihenfolge = new EinfachVerketteteListe();
setPreferredSize(new Dimension(width, height));
setBackground(Color.black);
//addMouseMotionListener(new MouseMotionHandler());

}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
ListElement le = BilderReihenfolge.getFirstElem();
while (le != null)
{
g2D.drawImage(le.getObj().getImage(), le.getObj().getX(),le.getObj().getY(), this);
le = le.getNextElem();

//g2D.drawImage(background.getBufferedImage(),0,0, this);
}
}

class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}

public void mouseMoved(MouseEvent e) {
}
}
public void addImage(String name, int x, int y)
{
BilderReihenfolge.addLast(new ImageManager(name, x, y));
repaint();
}
public void delete(String name)
{
BilderReihenfolge.deleteString(name);
repaint();
}
}

class GameTimer
{

private final int NANOSECONDS = 1000000000;

private boolean timerStarted;
private long beginTime, time, timeDifference;

public GameTimer()
{
timerStarted = false;
beginTime = 0;
time = 0;
timeDifference = 0;

}

public void start()
{

timerStarted = true;
beginTime = System.nanoTime();

}

public void stop()
{
timerStarted = false;
beginTime = 0;

}

public int get()
{
time = System.nanoTime();
timeDifference = time - beginTime;
beginTime = time;

return (int)timeDifference;
}

}

class EinfachVerketteteListe {

ListElement startElem;

public EinfachVerketteteListe()
{
}

public void addLast(ImageManager o){
if(startElem == null)
startElem = new ListElement(o);
else
{
ListElement newElem = new ListElement(o);
ListElement lastElem = getLastElem();
lastElem.setNextElem(newElem);
}
}

public void insertAfter(ImageManager prevItem, ImageManager newItem) {
ListElement newElem, nextElem, pointerElem;
pointerElem = startElem.getNextElem();
while(pointerElem != null && !pointerElem.getObj().equals(prevItem)){
pointerElem = pointerElem.getNextElem();
}
newElem = new ListElement(newItem);
nextElem = pointerElem.getNextElem();
pointerElem.setNextElem(newElem);
newElem.setNextElem(nextElem);
}

public void delete(ImageManager o){
ListElement le = startElem;
while (le.getNextElem() != null && !le.getObj().equals(o)){
if(le.getNextElem().getObj().equals(o)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}

public ImageManager findObj(String name)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(name))
{
return le.getObj();
}
le = le.nextElem;
}
return null;
}

public void deleteString(String name)
{
while(findPic(name)!=null)
{
ListElement le = startElem;
while (le.getNextElem() != null){
if(le.getNextElem().getObj().getName().equals(name)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}

}

public boolean find(ImageManager o){
ListElement le = startElem;
while (le != null){
if(le.getObj().equals(o))
return true;
le = le.nextElem;
}
return false;
}
public Image findPic(String bild)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(bild))
{
return le.getObj().getImage();
}
le = le.nextElem;
}
return null;
}

public ListElement getFirstElem() {
return startElem;
}

public ListElement getLastElem() {
ListElement le = startElem;
while(le.getNextElem() != null){
le = le.getNextElem();
}
return le;
}

public void writeList() {
ListElement le = startElem;
while(le != null){
System.out.println(le.getObj());
le = le.getNextElem();
}
}
}

class ListElement {

ImageManager obj;

ListElement nextElem;

public ListElement(ImageManager obj) {
this.obj = obj;
nextElem = null;
}

public void setNextElem(ListElement nextElem) {
this.nextElem = nextElem;
}

public ListElement getNextElem() {
return nextElem;
}

public ImageManager getObj() {
return obj;
}
}
[/Java]


Ich hoffe Ihr findet eine Lösung und bedanke mich schonmal im voraus
 

André Uhres

Top Contributor
Mein Problem sind nun die KeyListener.
Wie soll oder besser gesagt kann ich die Implementieren. Ich muss ja individuell entscheiden was gemacht werden soll wenn irgendwas passiert.

Der Listener muss die Grafik kennen (d.h. das Objekt mit den der Grafik zugrunde liegenden Daten), um sie über die Tastaturereignisse zu benachrichtigen. Die Anzeige ihrerseits muss sich bei der Grafik registrieren, um von ihr über Änderungen informiert zu werden und die Anzeige entsprechen anzupassen. Siehe auch http://www.java-forum.org/allgemeines/91829-mvc.html.

Gruß,
André
 

Maicus

Mitglied
Also heißt das, das der keylistener in der engine "klasse" sein muss.
Ich habe mir überlegt das es doch wie bei try und catch oder so die möglichkeit gibt sachen an die klasse zu schicken die einen aufgerufn hat. Gibt es da einen einfachen weg sowas zu implementieren oder habt Ihr eine Idee wie ich das Problem lösen kann?
 

André Uhres

Top Contributor
Ich habe mir überlegt das es doch wie bei try und catch oder so die Möglichkeit gibt Sachen an die Klasse zu schicken die einen aufgerufen hat. Gibt es da einen einfachen Weg sowas zu implementieren oder habt Ihr eine Idee wie ich das Problem lösen kann?

Jede Methode hat ja einen Rückgabe-Wert, falls Du das meinst. Darüber hinaus gibt es, wie schon angedeutet, das "Observer Pattern": wenn der Zustand eines Objektes ändert, werden die abhängigen Objekte benachrichtigt. In dem Link in meinem obigen Beitrag findest Du ein Beispiel. Ich hoffe das hilft.

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
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
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
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3
E KeyListener AWT, Swing, JavaFX & SWT 5
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben