Announcement

Collapse
No announcement yet.

Keylistener in einer Schleife

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Keylistener in einer Schleife

    Ist es möglich, die "keypressed"-Methode in einer Do-While-Schleife anzuwenden, sodass die Schleife erst weiter läuft, wenn eine Taste gedrückt wurde?

  • #2
    Wozu, damit würde dein ganzes Programm "stehen"? Ich könnte mir jetzt keinen Anwendungsfall vorstellen.
    Christian

    Comment


    • #3
      Die Überlegung ist folgende:

      Ich programmiere ein kleines Spiel names "Schildkrötenjagd". Dabei bewegt sich eine Schildkröte (A) zufällig über das Fenster, während die zweite Schildkröte (B) über die Pfeiltasten gesteuert wird. Abwechslend bewegt sich jeweils A um eine gewisse Distanz bzw. Richtung und anschließend B.
      Dabei soll nun die Schleife so lange druchlaufen werden, bis B A gefangen hat (d.h. die gleichen Koordinaten aufweist).

      Als Konsolenanwendung hab' ich das ganze schon umgesetzt, dabei wird B über die Eingabe bestimmter BUchstaben bewegt.

      Comment


      • #4
        Da sind doch Schleifen unnötig (diese sind in "ereignisgesteuerten" Programmen im Gegensatz zu Konsolenprogrammen fast nie erforderlich)

        Es gibt eine Methode die die computergesteuerte Schildkröte A fortbewegt.
        Der KeyListener wartet auf die Eingabe für Kröte B führt diese durch und ruft anschließend die Methode für A auf. So erfolgt immer eine Eingabe für B und dann bewegt sich A auch.

        Sollte sich A kontinuierlich bewegen so wird ein TimerTask implementiert der die Methode nach X Millisekunden aufruft. Dann würde sich A immer unabhängig von einer Eingabe zu B bewegen.

        Mit Schleifen blockierst du das Programm
        - das Fenster kann nicht verschoben werden
        - wenn andere Fenster dein Programm überdeckt haben, wird es nicht neu gezeichnet
        - Menüs, Buttons u.a. werden nicht ausgeführt
        - ....
        Christian

        Comment


        • #5
          Vielen Dank für den tollen Tipp. Das klingt alles sehr plausibel.

          Nur ist mir noch nicht ganz klar, wie ich es ohne Schleife schaffe, die Prozedur so oft zu durchlaufen, bis die Schildkörte gefangen wurde.

          Comment


          • #6
            Nach deinen Vorgaben müsste das in dem KeyListener für die Bewegung von A geprüft werden. Wird eine Pfeiltaste gedrückt, wird die neue Position berechnet. Stimmt diese mit B überein, so ist die Kröte gefangen, ansonsten kann sie sich durch Aufruf der Methode weiter bewegen
            Christian

            Comment


            • #7
              Nun, ich hab' das jetzt mal versucht so umzusetzen. Leider geschieht nun das selbe wie zuvor bei der Schleife: Es wird nicht auf die Tasteneingabe gewartet.

              Hier mal mein kompletter Code:

              Code:
              import java.awt.Color;
              import java.awt.event.KeyEvent;
              import java.awt.event.KeyListener;
              import ch.aplu.turtle.Turtle;
              
              public class schildkroetenjagd_tasten implements KeyListener
              {
              
              	public static Turtle adam = new Turtle();
              	public static Turtle eva = new Turtle(adam);
              	public static int count = 0;
              	
              	public schildkroetenjagd_tasten()
              	{
              		 adam.addKeyListener(this);
              	}
              	
              	public void keyPressed(KeyEvent evt) 
              	{
              		int keyCode = evt.getKeyCode();
              		
              			switch(keyCode)
              			{
              				case KeyEvent.VK_UP:
              					adam.forward(50);
              					break;
              				case KeyEvent.VK_DOWN:
              					adam.back(50);
              					break;
              				case KeyEvent.VK_LEFT:
              					adam.left(90).forward(50);
              					break;
              				case KeyEvent.VK_RIGHT:
              					adam.right(90).forward(50);
              					break;
              				default:
              			}
              	}
              	
              	public static void main(String[] args) throws InterruptedException 
              	{
              		//adam properties
              		adam.setColor(new Color(255,0,0));
              		adam.setPos(-150,0);
              		adam.penUp();
              		adam.setTitle("Jagd");
              		
              		//eva properties
              		eva.setColor(new Color(0,0,255));
              		eva.setPos(150,0);
              		eva.penUp();
              		
              		EVA_movement();
              		
              	}//end main
              
              	public static void EVA_movement()
              	{
              		
              		double var;
              		
              		//Bewegungsablauf EVA
              		var = Math.random();
              		if(var<=0.25)
              			{eva.forward(50);}
              		else if(var<=0.50)
              			{eva.back(50);}
              		else if(var<=0.75)
              			{eva.left(90).forward(50);}
              		else if(var<=1.00)
              			{eva.right(90).forward(50);}
              		
              		//Wiedereintritt EVA
              		if(eva._getX()>200)
              			{eva.setPos(-200, eva._getY());}
              		else if(eva._getX()<-200)
              			{eva.setPos(200, eva._getY());}
              		else if(eva._getY()>200)
              			{eva.setPos(eva._getX(), -200);}
              		else if(eva._getY() < -200)
              			{eva.setPos(eva._getX(), 200);}
              		
              		//Ueberpruefung: Koordinaten Uebereinstimmung
              		if((Math.round(eva._getX()) == Math.round(adam._getX())) 
              		&& (Math.round(eva._getY()) == Math.round(adam._getY())))
              			{
              			System.out.println("GEWONNEN! Du hast Eva nach " + count + " Runde(n) erwischt!");
              			}
              		else
              			{
              			ADAM_movment();
              			}
              	}
              	
              	public static void ADAM_movment()
              	{
              
              		//Bewegungsablauf ADAM
              		System.out.println("Bitte betaetigen Sie die Steuerungstaste");
              		new schildkroetenjagd_tasten();
              		
              		//Wiedereintritt ADAM
              		if(adam._getX()>200)
              			{adam.setPos(-200, adam._getY());}
              		else if(adam._getX()<-200)
              			{adam.setPos(200, adam._getY());}
              		else if(adam._getY()>200)
              			{adam.setPos(adam._getX(), -200);}
              		else if(adam._getY() < -200)
              			{adam.setPos(adam._getX(), 200);}
              		
              		//Anzahl der Runden
              		count += 1;
              		
              		EVA_movement();
              	}
              
              	@Override
              	public void keyReleased(KeyEvent e) {
              		// TODO Auto-generated method stub
              		
              	}
              
              	@Override
              	public void keyTyped(KeyEvent e) {
              		// TODO Auto-generated method stub
              		
              	}
              
              }//end class

              Comment


              • #8
                Dein Programm ruft nie den Listener (schildkroetenjagd_tasten()) auf, läuft einmal durch und fertig. Sicherlich brauchst du hier in deiner Main einer Schleife, damit das Programm sich nicht beendet
                Als Konsolenanwendung hab' ich das ganze schon umgesetzt, dabei wird B über die Eingabe bestimmter BUchstaben bewegt.
                Ich habe deine Beschreibung so verstanden, dass du ein JFrame oder JDialog als Grundlage hast und die Ausgabe auf ein Panel machst. Das ist doch auch eine Konsolenanwendung
                Christian

                Comment


                • #9
                  Aber der Listener wird doch in der Methode "ADAM_movement()" aufgerufen. Und in diese Methode springt das Programm doch immer, wenn die Koordinaten nicht übereinstimmen, oder?

                  Comment


                  • #10
                    Code:
                    import java.awt.Graphics;
                    public class NewJDialog extends javax.swing.JDialog
                    {
                    public NewJDialog(java.awt.Frame parent,boolean modal)
                        {
                        super(parent,modal);
                        initComponents();
                        }
                    @Override
                    public void paint(Graphics arg0)
                        {
                        super.paint(arg0);
                        //Code zum zeichnen der Kröten
                        }
                        private void initComponents() {
                            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                            addKeyListener(new java.awt.event.KeyAdapter() {
                                public void keyPressed(java.awt.event.KeyEvent evt) {
                                    formKeyPressed(evt);
                                }
                            });
                            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
                            getContentPane().setLayout(layout);
                            layout.setHorizontalGroup(
                                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGap(0, 511, Short.MAX_VALUE)
                            );
                            layout.setVerticalGroup(
                                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGap(0, 400, Short.MAX_VALUE)
                            );
                            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
                            setBounds((screenSize.width-519)/2, (screenSize.height-434)/2, 519, 434);
                        }
                    private void formKeyPressed(java.awt.event.KeyEvent evt) {
                        // Code zum setzen der Kröte B
                        repaint();
                    }
                    private void moveKroeteA()
                        {
                        // Code zum setzen der Kröte A
                        }
                    public static void main(String args[])
                        {
                        java.awt.EventQueue.invokeLater(new Runnable()
                        {
                        public void run()
                            {
                            NewJDialog dialog=new NewJDialog(new javax.swing.JFrame(),true);
                            dialog.addWindowListener(new java.awt.event.WindowAdapter()
                            {
                            public void windowClosing(java.awt.event.WindowEvent e)
                                {
                                System.exit(0);
                                }
                            });
                            dialog.setVisible(true);
                            }
                        });
                        }
                     }
                    Christian

                    Comment


                    • #11
                      Danke für Deine Hilfe...werde es demnächst ausprobieren und hoffen, das es funktioniert.

                      PS: C-Ecke ist ne klasse Website!

                      Comment


                      • #12
                        Danke für Deine vorgefertigten Code. Leider initialisiert die Schildkröte selbst das Fenster, d.h. ich kann kein eigenes Fenster erzeugen und dann die Schildkröte dort hineinsetzen. (Zumindest weiß ich nicht, wie das geht)

                        Wenn ich das Problem aber mal etwas auf das Wesentlich reduziere, dann geht es eigentlich nur darum, abwechselnd eine Schildkröte (Simon) automatisch bewegen zu lassen und eine weitere Schildkröte (Alex) über Pfeiltasten zu steuern.
                        Warum funktioniert es auf folgende Art und Weise nicht?

                        Code:
                        import ch.aplu.turtle.Turtle;
                        import java.awt.*;
                        import java.awt.event.*;
                        
                        public class Tasten
                        {
                        
                        	public static Turtle Alex = new Turtle();
                        	public static Turtle Simon = new Turtle(Alex);
                        	
                        	public static void main(String[] args) throws InterruptedException
                        	{
                        		Simon.setColor(new Color(255,0,0));
                        		movement_alex();
                        	}
                        
                        	public static void movement_alex() throws InterruptedException
                        	{
                        		
                        		KeyListener listener = new KeyListener() 
                        		{
                        		      public void keyPressed(KeyEvent e) 
                        		      {
                        		  		int keyCode = e.getKeyCode();
                        				
                        				switch(keyCode)
                        				{
                        				case KeyEvent.VK_UP:
                        					Alex.forward(50);
                        					break;
                        				case KeyEvent.VK_DOWN:
                        					Alex.back(50);
                        					break;
                        				case KeyEvent.VK_LEFT:
                        					Alex.left(90).forward(50);
                        					break;
                        				case KeyEvent.VK_RIGHT:
                        					Alex.right(90).forward(50);
                        					break;
                        				}	
                        		      }
                        
                        			@Override
                        			public void keyReleased(KeyEvent e) {
                        				// TODO Auto-generated method stub
                        				
                        			}
                        
                        			@Override
                        			public void keyTyped(KeyEvent e) {
                        				// TODO Auto-generated method stub
                        				
                        			}
                        		};
                        		Alex.addKeyListener(listener);
                        		movement_simon();
                        	}
                        	
                        	public static void movement_simon() throws InterruptedException
                        	{
                        		Simon.forward(50);
                        		movement_alex();
                        	}
                        
                        }

                        Comment


                        • #13
                          Die Main ruft movement_Alex auf. Diese addet jedesmal den Listener?? Der wann ausgeführt wird?
                          Christian

                          Comment


                          • #14
                            Aha, vielleicht liegt hier mein Denkfehler.
                            Bisher dachte ich, dass an der Stelle

                            Code:
                            Alex.addKeyListener(listener);
                            auch auf eine Eingabe gewartet wird. Das scheint nicht der Fall zu sein.
                            Aber wie gelingt es mir, an dieser Stelle auf eine Tasteneingabe zu warten?

                            Comment


                            • #15
                              Ein Listener wartet nicht. Wie der Name schon sagt, lauscht er. Er wird an "Etwas" gebunden, welches ein entsprechendes Ereignis auslösen kann. Das "Etwas" führt eine Liste von Listenern, die gerne über das Ereignis informiert werden wollen. Dazu werden sie diesem "Etwas" über "addListener" hinzugefügt.

                              Tritt das Ereignis ein, informiert das "Etwas" alle angemeldeten Listener über das Eregnis (sie "feuern" ein Event). Diese wiederum rufen ihre ensprechende Methode auf, die du überschrieben hast und können reagieren.

                              Ich bezweifle, dass die Konsole so ein "Etwas" ist. Bloß weil du das Interface in deiner Konsole implementierst, wird diese noch lange keine Events senden.

                              M.E. entweder Konsole oder Swing.
                              Christian

                              Comment

                              Working...
                              X