KeyPressed() reagiert nicht

Masterpurzel

Mitglied
Hallo,

ich hänge jetzt schon seit 2 Stunden an meinem Problem und weiß nicht wie ich es lösen kann...

Ich habe mehrere Klassen, die eine ist von JApplet abgeleitet und die 2. von JPanel, der Rest sind verschiedene Programmteile!

Mein Problem:

Wenn ich mein Applet in Eclipse im AppletViewer öffne, funktioniert die Methode KeyPressed(), wenn ich es allerdings in einer html Datei eingebettet ausführe, reagiert die Methode KeyPressed() nicht.

den Fokus habe ich schon in der Klasse mit extends JPanel gesetzt

Java:
setFocusable(true);
setFocusTraversalKeysEnabled(false);

keine Reaktion!

LG Masterpurzel

Achja vergessen, hier mein Code:

PingPong.java
Java:
package pingpong;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;

//public class PingPong extends JApplet implements Runnable, Observer, PropertyChangeListener {
public class PingPong extends JApplet implements Runnable, PropertyChangeListener {
	private static final long serialVersionUID = 1L;
	LayoutManager layout;
	Thread thread;
	int gamestatus;
	JLabel points = new JLabel("");
	int punkte;
	
	public void propertyChange(PropertyChangeEvent pce) {
		/*System.out.println("Bei der " + pce.getSource() + " wurde der Parameter \"" + 
							pce.getPropertyName() + "\" von \"" + pce.getOldValue() + 
							"\" auf \"" + pce.getNewValue() + "\" geaendert.");*/
		if(pce.getPropertyName().equals("key")) {
			System.out.println("KeyCode: " + pce.getNewValue());
		}
		if(pce.getPropertyName().equals("gamestatus") && pce.getNewValue().equals("0")) {
			System.out.println("Gamestatus: 0");
		}
		if(pce.getPropertyName().equals("points")) {
			System.out.println("Punkte: " + pce.getNewValue());
			points.setText("" + pce.getNewValue());
			punkte = (Integer)pce.getNewValue();
		}
		if(pce.getPropertyName().equals("gamestatus") && pce.getNewValue().equals("0")) {
			System.out.println("Spiel zu Ende!");
			final JDialog popup = new JDialog();
			popup.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			popup.setSize(350, 100);
			popup.setLayout(new GridBagLayout());
			GridBagConstraints gbc = new GridBagConstraints();
			// Label Punkte
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 0; // Column
			gbc.gridy = 0; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 1;
			gbc.insets = new Insets(0, 0, 0, 0); //Abstand: oben, links, unten, rechts
			popup.add(new JLabel("Ihre Punkte: "), gbc);
			// Punkte
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 1; // Column
			gbc.gridy = 0; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 1;
			gbc.insets = new Insets(0, 0, 0, 0); //Abstand: oben, links, unten, rechts
			popup.add(points, gbc);
			// Label Name
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 0; // Column
			gbc.gridy = 1; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 1;
			gbc.insets = new Insets(0, 0, 0, 10); //Abstand: oben, links, unten, rechts
			popup.add(new JLabel("Ihr Name: "), gbc);
			// Textfeld Name
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 1; // Column
			gbc.gridy = 1; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 2;
			gbc.insets = new Insets(0, 0, 0, 0); //Abstand: oben, links, unten, rechts
			final JTextField tf_name = new JTextField(20);
			popup.add(tf_name, gbc);
			// Textfeld Name
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 0; // Column
			gbc.gridy = 2; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 1;
			gbc.insets = new Insets(0, 0, 0, 10); //Abstand: oben, links, unten, rechts
			JButton save = new JButton("Speichern");
			save.setEnabled(false);
			save.setToolTipText("Diese Funktion ist leider noch nicht implementiert!");
			save.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if(tf_name.getText().equals("")) {
						
					} else {
						new Save(punkte, tf_name.getText(), popup);
					}
				}
			});
			popup.add(save, gbc);
			// Textfeld Name
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx = 1; // Column
			gbc.gridy = 2; // Row
			gbc.gridheight = 1;
			gbc.gridwidth = 1;
			gbc.insets = new Insets(0, 0, 0, 0); //Abstand: oben, links, unten, rechts
			JButton abort = new JButton("Abbrechen");
			abort.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					abort(popup);
				}
			});
			popup.add(abort, gbc);
			
			popup.setResizable(false);
			popup.setVisible(true);
		}
	}
	
	public void init() {
		
	}
	
	public void start() {
		if(thread == null) {
	        thread = new Thread(this);
	        thread.start();
	    }
		
		// Menu
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("Datei");
        JMenu overMenu = new JMenu("Hilfe");
        menuBar.add(fileMenu);
        menuBar.add(overMenu);
        JMenuItem exitAction = new JMenuItem("Beenden");
        JMenuItem infoAction = new JMenuItem("Info");
        //infoAction.setIcon(new ImageIcon(getClass().getResource("CustomImage/info.png")));
        fileMenu.add(exitAction);
        overMenu.add(infoAction);
        exitAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                exit();
            }
        });
        infoAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                
            }
        });
		
		layout = new GridLayout(0, 1);
        setLayout(layout);
        
        MainDrawing draw = new MainDrawing();
        add(draw);
        //draw.setFocusable(true);
	}
	
	@SuppressWarnings("deprecation")
	public void stop() {
		if(thread != null && thread.isAlive()) {
			thread.stop();
			thread = null;
		}
	}
	
	public void destroy() {
		
	}

	public void run() {
		while(true) {
			repaint();
			try {
				Thread.sleep(15);
			} catch(InterruptedException e) {
				
			}
		}
	}
	
	public void exit() {
		System.exit(0);
	}
	
	public void abort(JDialog popup) {
		popup.dispose();
	}
}

MainDrawing.java
Java:
package pingpong;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;

import javax.swing.JPanel;

public class MainDrawing extends JPanel implements MouseListener, KeyListener {
	private static final long serialVersionUID = 1L;
	private Image dbImage;
	private Graphics dbg;
	int kugel_xpos = 0;
	int kugel_ypos = 0;
	boolean kugel_direction_xpos = true;
	boolean kugel_direction_ypos = true;
	int balken_hoehe = 50;
	int balken_xpos = 5;
	int balken_ypos = 5;
	int points = -1;
	int counter;
	int gamestatus = -1;
	
	public MainDrawing() {
		addMouseListener((MouseListener)this);
		addKeyListener((KeyListener)this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        //requestFocusInWindow();
        //requestFocus();
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D)g;
		//g2d.drawRect(balken_xpos, balken_ypos, 20, 20);
		if(gamestatus == -1) {
			gamestop(g2d);
		} else if(gamestatus == 1) {
			gamestart(g2d);
			for(int i = 999999; i >= 0; i--) {
				counter -= i;
				if(gamestatus == 1 && counter == 0) {
					gamestatus = 0;
				    Updatable_Objects aktu = new Updatable_Objects(new Quelle());
					aktu.addPropertyChangeListener(new PingPong());
					aktu.setGameStatus("" + gamestatus);
					aktu.setPoints(points);
				}
			}
		} else if(gamestatus == 0) {
			gameend(g);
		}
	}
	
	public void update(Graphics g) {
		// Initialisierung des DoubleBuffers
		if(dbImage == null)	{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
	
	public void mouseClicked(MouseEvent e) {
		if(gamestatus == -1 && e.getClickCount() == 2) {
			gamestatus = 1;
		}
	}

	public void mousePressed(MouseEvent e) {
		
	}

	public void mouseReleased(MouseEvent e) {
		
	}

	public void mouseEntered(MouseEvent e) {
		
	}

	public void mouseExited(MouseEvent e) {
		
	}
	
	public void keyPressed(KeyEvent e) {
		Updatable_Objects aktu = new Updatable_Objects(new Quelle());
		aktu.addPropertyChangeListener(new PingPong());
		// Taste nach oben
	    if(e.getKeyCode() == 38) {
	      balken_ypos -= 1;
	      aktu.setKeyCode("" + e.getKeyCode());
	    // Taste nach unten
	    } else if(e.getKeyCode() == 40) {
	      balken_ypos += 1;
	      aktu.setKeyCode("" + e.getKeyCode());
	    } else {
	    	System.out.println("Key: " + e.getKeyCode());
	    	aktu.setKeyCode("" + e.getKeyCode());
	    }
	}

	public void keyTyped(KeyEvent e) {
		
	}

	public void keyReleased(KeyEvent e) {
		
	}
	
	public void gamestart(Graphics g) {
		g.drawRect(0, 0, 153, 153);
		g.drawString(points + " Punkte", 153 / 2, 15);
		g.drawString(counter + " s", 153 / 2, 25);
		//g.drawString("Balken Startposition y: " + balken_ypos, 25, 25);
		//g.drawString("Balken Endposition: " + (balken_ypos + balken_hoehe), 25, 35);
		g.fillRect(balken_xpos, balken_ypos, 15, balken_hoehe);
		g.fillOval(kugel_xpos, kugel_ypos, 15, 15);
		if(kugel_direction_xpos == true) {
			kugel_xpos += 1;
			if(kugel_xpos == 140) {
				kugel_direction_xpos = false;
			}
		} else {
			kugel_xpos -= 1;
			if(kugel_xpos == balken_xpos + 14) {
					kugel_direction_xpos = true;
			}
		}
		if(kugel_direction_ypos == true) {
			kugel_ypos += 1;
			if(kugel_ypos == 140) {
				kugel_direction_ypos = false;
			}
		} else {
			kugel_ypos -= 1;
			
			if(kugel_ypos == 0) {
				kugel_direction_ypos = true;
			}
		}
		if(kugel_ypos > balken_ypos && kugel_ypos < (balken_ypos + balken_hoehe) && kugel_xpos == balken_xpos + 14) {
			points++;
		} else if(kugel_ypos != balken_ypos) {
			
		}
	}
	
	public void gamestop(Graphics g) {
		g.drawString("Bitte Spiel mit Doppelklick starten!", 0, 153 / 2);
	}
	
	public void gameend(Graphics g) {
		g.drawString("Das Spiel ist zu Ende, ", 10, 75);
		g.drawString("ihre Punkte: " + points, 10, 90);
	}
}

der restliche Code sollte in diesem Fall uninteressant sein, falls doch nicht bitte melden!

LG Masterpurzel
 
Zuletzt bearbeitet:
Kann es vielleicht sein, dass man erst auf die Fläche des Plugins klicken muss, um es zu aktivieren? Da Java ein Plugin für den Browser ist, muss der Browser die Eingabe und die MouseEvents explizit an das Applet weiterleiten. die meisten gängigen Browser tun das jedoch nur, wenn du in die Fläche des Applets klickst. Sobald du wieder irgend wo in die Nähe klickst, verliert dein Applet wieder den Focus und kann nicht mehr auf Tastatureingaben etc. reagieren.

PS: Du verwendest JAVA-Code, nicht PHP wie deine Tags simulieren ;)
 
Kann es vielleicht sein, dass man erst auf die Fläche des Plugins klicken muss, um es zu aktivieren? Da Java ein Plugin für den Browser ist, muss der Browser die Eingabe und die MouseEvents explizit an das Applet weiterleiten. die meisten gängigen Browser tun das jedoch nur, wenn du in die Fläche des Applets klickst. Sobald du wieder irgend wo in die Nähe klickst, verliert dein Applet wieder den Focus und kann nicht mehr auf Tastatureingaben etc. reagieren.

Auch wenn ich ins Applet klicke geht es nicht, ich muss ja das Spiel mit Doppelklick starten, das geht auch. Wenn ich dann mit der Tastatur was mache geht es nicht auch mit mehrmaligen klicken ins Applet...

PS: Du verwendest JAVA-Code, nicht PHP wie deine Tags simulieren ;)

Danke für den Tipp, habe ich wohl übersehen, ist geändert :)

PS: was mir noch aufgefallen ist, vllt nützlich:

Im AppletViewer bekomme ich mit dieser Zeile ausgaben in Eclipse, aber in der Java Console im Browser nicht:

Java:
System.out.println("Key: " + e.getKeyCode());

LG Masterpurzel
 
Zuletzt bearbeitet:
Zurück