Linie ausgeben, die sich auf Knopfdruck verlängert

Status
Nicht offen für weitere Antworten.

Schubi

Mitglied
Hallo 🙂
Also dieses Thema knüpft an das von gestern an (Linie ausgeben, die sich Periodisch verlängert).

Und zwar habe ich folgende Klassen:
(Habe die zu meinem Verständnis auskommentiert)

AnimationDemo:

Code:
import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class AnimationDemo extends JFrame implements KeyListener { //AnimationDemo erbt von JFrame bzw. AnimationDemo erweitert JPanel
        private Kurve neueKurve; //Objekt Kurve wird mit Namen "neueKurve" bereitgestellt
        private GrafikPanel grafikPanel;
        
        public AnimationDemo() { //Konstruktor
            super("Grafik"); //Beschriftung für das Zeichenfenster was noch erstellt wird
            setSize(500,500); //Größe für das Zeichenfenster
            setBackground(Color.white);
            grafikPanel = new GrafikPanel(); //Objekt GrafikPanel mit Namen "grafikPanel" wird erstellt
            add(grafikPanel); /* Fügt grafikPanel in den Container des JFrames ein (in dessen contentPanel)
                              ***Bedeutet das das Objekt "grafikPanel" im JFrame ausgegeben wird
                              ***Es wird also zu JFrame zum ausgeben hinzugefügt
                              */
            neueKurve = new Kurve(grafikPanel); //Objekt "neueKurve" wird erstellt und als Parameter das Objekt "grafikPanel" übergeben
            neueKurve.start(); //Thread wird gestartet
            setVisible(true); //Fenster sichtbar machen
        }
        public void keyPressed(KeyEvent event) {
            if(event.getKeyCode() == KeyEvent.VK_LEFT) {
              grafikPanel.setI();
            }
        }
        public void keyReleased(KeyEvent event) {
        }
        public void keyTyped(KeyEvent event) {
        }
        
        public static void main(String args[]) { 
            new AnimationDemo(); //Objekt AnimationDemo wird erstellt
        }
    }


Kurve:

Code:
import java.awt.*;
    import javax.swing.*;
    
    class Kurve extends Thread { // Klasse die von Thread erbt
        private GrafikPanel grafikPanel; // Objekt wird mit Namen "grafikPanel" belegt
        public Kurve(GrafikPanel grafikPanel) { //Methode, die ein Objekt als Parameter erwartet
            this.grafikPanel = grafikPanel; /*  Instanzvariable wird gezielt adressiert, da
                                            *** der Parameter auch grafikPanel heißt und er
                                            *** deswegen die Instanzvariable überlagert
                                            */
        }
        public void run() { // Thread wird gestartet                                
            while(true) {
                try {
                    sleep(50);
                }
                catch (InterruptedException e) {
                }
                grafikPanel.repaint(); /*  wird genutzt um "GrafikPanel neu zu zeichnen
                                       *** dadurch wird indirekt die Methode "paintComponent"
                                       *** aufgerufen und so die Linie aktualisiert.
                                       */
                
               // grafikPanel.setI(); //Methode "setI" wird aufgerufen 

            }
        }
    }

GrafikPanel:

Code:
    import java.awt.*;
    import javax.swing.*;
    
    class GrafikPanel extends JPanel { //GrafikPanel erbt von JPanel
        int i;
        public GrafikPanel() { //Konstruktor
            i = 41;
        }
        public void paintComponent(Graphics g) { /*  "paintComponent" ist eine von JPanel geerbte 
                                                 *** Methode,die wir überschreiben,d.h. neu definieren 
                                                 *** um unsere Linie zu zeichnen
                                                 *** "Graphics g" stellt ein Grafikobjekt mit dem Namen
                                                 *** g bereit und übergibt es "paintComponent"
                                                 */
            g.drawLine(100,40,100,i); //Linie wird gezeichnet an Positionen (x1,y1 zu x2,y2) 
        }
        public void setI() { //Methode die I um 1 erhöht
            i++;
        }
    }

Auf tastendruck soll jetzt die Linie verlängert werden. Warum bleibt Trotzdem wenn ich die Pfeiltaste nach Links drücke die Linie gleichlang? Ich erhöhe doch die Variable i um 1, oder etwa nicht?

Danke im vorraus 🙂

MfG

Schubi
 
du brauchst unbedingt
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sonst laufen einmal gestartete Programme im weiter, auch wenn das Fenster geschlossen wird,

--------------

mach doch erstmal einen einfachen KeyListener

public void keyPressed(KeyEvent event) {
System.out.println("keyPressed");
}

public void keyReleased(KeyEvent event) {
System.out.println("keyReleased");
}

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

um zu sehen, ob das überhaupt funktioniert

------------

der KeyListener wird in deinem Programm nämlich nirgendwo verwendet, daher auch keine Reaktion auf die Tastatur,

im JFrame
addKeyListener(this);
scheint zu funktionieren, dann sehe ich auch die Linie wachsen,
ein Pixel ist natürlich nicht allzu viel
 
Ups ^^
Ja klar 🙂 Man irgendwie ist das ungewohnt das man jede Aktion die man machen möchte vorher im JFrame "adden" muss!
Also das Turtle Prinzip war einfacher *gg* 😉

Danke schön, funktioniert alles wie ich es mir vorstelle 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben