q1:eventlistener

Listener dienen zur Kommunikation zwischen dem Benutzer eines Programms und dem Programm selbst. Wenn ein Benutzer mit einem grafischen Element, beispielsweise einem JButton oder einer JList, interagiert, werden bestimmte Methoden ausgeführt. Diese Methoden kann der Programmierer überschreiben und somit seine eigenen Aktionen programmieren, welche bei einem Klick auf einen JButton o.ä. ausgeführt werden.

Zu diesem Zweck existieren mehrere Listener. Die folgende Liste enthält wohl die wichtigsten Listener die man benötigt um eine grafische Oberfläche zu erstellen. Weitere findet man in der Java API [Jav]:

  • ActionListener
  • ChangeListener
  • ItemListener
  • KeyListener
  • ListDataListener
  • ListSelectionListener
  • MouseListener
  • MouseMotionListener
  • ItemListener
  • etc.

Alle diese Listener besitzen verschiedene Funktionen, welche aufgerufen werden, wenn eine bestimmte Benutzereingabe erfolgt. Diese hängen oftmals auch von bestimmten grafischen Elementen ab. So benutzt man beispielsweise den ActionListener um bei JButtons auf Eingaben zu reagieren, ein MouseListener wird hingegen für Mauseingaben verwendet.

Java unterscheidet drei Varianten von KeyEvents, die auch durch statische int-Variablen in der Klasse KeyEvent repräsentiert werden: Wird eine Tastaturtaste betätigt, so wird als erstes ein KEY_PRESSED-Event erzeugt. Beim Lösen der Taste wird dann ein KEY_RELEASED-Event erzeugt. Gehört die gedrückte Taste zu einem Unicode-Charakter, so wird zusätzlich ein KEY_TYPED-Event generiert. Gelegentlich ist hierzu auch noch ein KEY_RELEASED-Event notwendig. Das Aktivieren einer Taste, die keinem Unicode-Character zuzuordnen ist, erzeugt zwar KEY_PRESSED- und KEY_RELEASED-Events, jedoch kein KEY_TYPED-Event.

Der Sinn hinter diesem Verhalten besteht darin, dass etliche Eingaben die Aktivierung mehrerer Tasten benötigen. Wird eine Tastenkombination gedrückt, z.B. im Laufe der Eingabe eines Großbuchstabens, so wird für jede Taste, die Shift- und die Buchstabentaste, je ein KEY_PRESSED- und ein KEY_RELEASED-Event erzeugt. Beide KEY_PRESSED-Events werden dann auf ein KEY_TYPED-Event übertragen, sodass dies für ein Zeichen nur einmal gesendet wird.

Ein Beispiel zum Ausprobieren

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.JFrame;
import javax.swing.JTextField;
 
public class UsingKeyListener {
  public static void main(String[] args) {
    JFrame aWindow = new JFrame("This is the Window Title");
 
    aWindow.setBounds(50, 100, 300, 300);
    aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    JTextField typingArea = new JTextField(20);
    typingArea.addKeyListener(new KeyListener() {
 
      /** Handle the key typed event from the text field. */
      public void keyTyped(KeyEvent e) {
        displayInfo(e, "KEY TYPED: ");
      }
 
      /** Handle the key pressed event from the text field. */
      public void keyPressed(KeyEvent e) {
        displayInfo(e, "KEY PRESSED: ");
      }
 
      /** Handle the key released event from the text field. */
      public void keyReleased(KeyEvent e) {
        displayInfo(e, "KEY RELEASED: ");
      }
 
      protected void displayInfo(KeyEvent e, String s) {
        String keyString, modString, tmpString, actionString, locationString;
 
        // You should only rely on the key char if the event
        // is a key typed event.
        int id = e.getID();
        if (id == KeyEvent.KEY_TYPED) {
          char c = e.getKeyChar();
          keyString = "key character = '" + c + "'";
        } else {
          int keyCode = e.getKeyCode();
          keyString = "key code = " + keyCode + " (" + KeyEvent.getKeyText(keyCode) + ")";
        }
 
        int modifiers = e.getModifiersEx();
        modString = "modifiers = " + modifiers;
        tmpString = KeyEvent.getModifiersExText(modifiers);
        if (tmpString.length() > 0) {
          modString += " (" + tmpString + ")";
        } else {
          modString += " (no modifiers)";
        }
 
        actionString = "action key? ";
        if (e.isActionKey()) {
          actionString += "YES";
        } else {
          actionString += "NO";
        }
 
        locationString = "key location: ";
        int location = e.getKeyLocation();
        if (location == KeyEvent.KEY_LOCATION_STANDARD) {
          locationString += "standard";
        } else if (location == KeyEvent.KEY_LOCATION_LEFT) {
          locationString += "left";
        } else if (location == KeyEvent.KEY_LOCATION_RIGHT) {
          locationString += "right";
        } else if (location == KeyEvent.KEY_LOCATION_NUMPAD) {
          locationString += "numpad";
        } else { // (location == KeyEvent.KEY_LOCATION_UNKNOWN)
          locationString += "unknown";
        }
 
        System.out.println(keyString);
        System.out.println(modString);
        System.out.println(actionString);
        System.out.println(locationString);
      }
 
    });
    aWindow.add(typingArea);
    aWindow.setVisible(true);
  }
}

Fliegendes Ufo

	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.*;
 
import ufo.Zeichenbrett.TastaturEingabe;
 
 
	public class Ufo extends JFrame{
		Container c;           
		Zeichenbrett z;   
 
		public Ufo(){
			super("Ufo");
			 c = getContentPane();      
			 z = new Zeichenbrett(); //Alles was passiert, passiert im Zeichenbrett, 
			    // ist ne saubere Lösung oder?  
			 z.setFocusable(true);
			 c.add(z);
			 setTitle("Ufo");
			 setSize(800,600);
			 setVisible(true);
			 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
		}
 
	  public static void main(String[] args) {
		  new Ufo();
	  }
	}
 
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
 
 
public class Zeichenbrett extends JPanel {
	static int x = 100;
	static int y = 100;
 
	Zeichenbrett(){
		super();
		this.addKeyListener(new TastaturEingabe());
	}
 
	public void paintComponent(Graphics g) { 
		super.paintComponent(g);
		zeichneUfo(g, x, y);
 
	}	
 
	void zeichneUfo(Graphics g, int xUfo, int yUfo)
	{
		g.drawRect(xUfo,yUfo,30,15);
		g.drawLine(xUfo+15,yUfo-10,xUfo+15,yUfo);
		g.drawLine(xUfo+10,yUfo+15,xUfo+5,yUfo+25);
		g.drawLine(xUfo+20,yUfo+15,xUfo+25,yUfo+25);
	}
 
	class TastaturEingabe implements KeyListener{
 
		@Override
		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_RIGHT)
			{
				x=x+10; 
			}
			if (e.getKeyCode() == KeyEvent.VK_LEFT)
			{
				x=x-10;   
			}
			if (e.getKeyCode() == KeyEvent.VK_UP)
			{
				y=y-10;   
			}
			if (e.getKeyCode() == KeyEvent.VK_DOWN)
			{
				y=y+10;
			}
			repaint();    
 
		}
 
		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
		}
 
		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
		}
 
	}
 
}

Die Klasse UFO kann weiterhin verwendet werden

 
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
 
 
public class Zeichenbrett extends JPanel {
  static int x = 100;
  static int y = 100;
 
  public Zeichenbrett(){
      super();
      this.addKeyListener(new TastaturEingabe());
      Thread tr = new Thread(new Gravitation());
      tr.start();
  }
 
  public void paintComponent(Graphics g) { 
      super.paintComponent(g);
      zeichneUfo(g, x, y);
 
  } 
 
  void zeichneUfo(Graphics g, int xUfo, int yUfo)
  {
      g.drawRect(xUfo,yUfo,30,15);
      g.drawLine(xUfo+15,yUfo-10,xUfo+15,yUfo);
      g.drawLine(xUfo+10,yUfo+15,xUfo+5,yUfo+25);
      g.drawLine(xUfo+20,yUfo+15,xUfo+25,yUfo+25);
  }
 
  class TastaturEingabe implements KeyListener{
 
      @Override
      public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            x=x+10; 
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            x=x-10;   
        }
        if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            y=y-10;   
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN)
        {
            y=y+10;
        }
        repaint();    
 
      }
 
      @Override
      public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
      }
 
      @Override
      public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
      }
 
  }
 
   class Gravitation implements Runnable{
 
     @Override
     public void run(){
            while(y<1000){
              y=y+1;
              try{
                  Thread.sleep(10);
                 }
              catch(Exception e){
                 }
               repaint();  
              }
       }
     }
 
}
  • /var/www/infowiki/data/pages/q1/eventlistener.txt
  • Zuletzt geändert: 2017/09/18 08:42
  • von admin03