mit Pfeiltasten steuern

Ich versuche Java mit einem Buch zu lernen. Ich stehe noch recht am Anfang. Als erstes möchte ich ein kleines Spiel schreiben. Als Spielfigur habe ich einen kleinen Pinguin gezeichnet. Jetzt sollte sich der Pinguin mit den Pfeiltasten bewegen lassen. Leider tut er das nicht. Hier ist mein bisheriger Code:

Java:
package JnR;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import JnR.Var;


import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;



public class Spielfeld extends JFrame {
    public static void main(String[] args) {
        
        
        
      
        
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            Spielfeld frame = new Spielfeld();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Spielfeld kann nicht geladen werden!");
        }
        }
    });
    
    
    
    }
    
    

    private JPanel contentPane;

    public Spielfeld() {
        
        
        
        setTitle("Spielfeld");
        setIconImage(Toolkit.getDefaultToolkit().getImage(Spielfeld.class.getResource("/JnR/pingu.png")));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1050, 750);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(224, 255, 255));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.setVisible(true);
        
        
        JLabel label = new JLabel("Pingu");
        label.setVisible(true);
        label.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent label) {
                int x = 203;
                int y = 575;
            
                if(label.getKeyCode()==KeyEvent.VK_UP) {
                    y = y-5;
                    System.out.println("vorwärts");
                }
                if(label.getKeyCode()==KeyEvent.VK_DOWN) {
                    y = y+5;
                    System.out.println("rückwärts");
                }
                if(label.getKeyCode()==KeyEvent.VK_LEFT) {
                    x = x-5;
                    System.out.println("links");
                }
                if(label.getKeyCode()==KeyEvent.VK_RIGHT) {
                    x = x+5;
                    System.out.println("rechts");
                }
                
                repaint();
            }
            
            
        });
        
        label.setFocusable(true);
        label.requestFocusInWindow();   
            
            
            
        label.setBounds(203, 575, 50, 80);
        label.setIcon(new ImageIcon(Spielfeld.class.getResource("/JnR/pingu.png")));
        contentPane.add(label);

    }

}

Vielen Dank für eure Hilfe.
 
K

kneitzel

Gast
Den KeyListener würde ich nicht vom Label sondern vom Spielfeld nehmen.

Nur das Control, das den Fokus hat, bekommt die Events des Keys und das Label dürfte nicht den Focus haben :)

Das wäre zumindest etwas, das mir gerade so aufgefallen ist.
 

Robat

Top Contributor
x und y sind lokale Variablen in der keyPressed Methode. Diese müssten schon Instanzvariablen sein. Außerdem musst du den Pinguin schon an der Stelle x, y zeichnen und nicht an festen Koordinaten

Noch viel besser wäre es wenn du deinen Spieler als eigene Klasse ansehen würdest
 
Ich habe versucht dem Pinguin eine eigene Klasse zu geben. Das hat leider überhaupt nicht funktioniert. So wie mein Code jetzt aussieht sollte er eigentlich jeweils bei den Koordinaten x und y gezeichnet werden und auf Tastendruck sollte es diese Koordinaten verschieben. Leider bewegt er sich immer noch kein Stück.

Die system.out.println("..."); werden mir angezeigt. Irgendwie bemerkt Java also, dass ich die Tasten drücke. Nur bringt er es leider nicht mit meinem JLabel in Verbindung.
Java:
package JnR;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import JnR.Var;


import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;
import javax.swing.JTextField;
import java.awt.Label;
import java.awt.Font;



public class Spielfeld extends JFrame {
    public static void main(String[] args) {
        
        
        
      
        
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            Spielfeld frame = new Spielfeld();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Spielfeld kann nicht geladen werden!");
        }
        }
    });
    
    
    
    }
    
    

    private JPanel contentPane;

    public Spielfeld() {
        
        
        
        setTitle("Spielfeld");
        setIconImage(Toolkit.getDefaultToolkit().getImage(Spielfeld.class.getResource("/JnR/pingu.png")));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1050, 750);
        contentPane = new JPanel();
        contentPane.setBackground(Color.WHITE);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.setVisible(true);
        
        
        JLabel label = new JLabel("");
        label.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                
                
            
                if(e.getKeyCode()==KeyEvent.VK_UP) {
                    int x = +5;                 
                    System.out.println("vorwärts");
                }
                if(e.getKeyCode()==KeyEvent.VK_DOWN) {
                    int x = -5;
                    System.out.println("rückwärts");
                }
                if(e.getKeyCode()==KeyEvent.VK_LEFT) {
                    int y = +5;
                    System.out.println("links");
                }
                if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                    int y = -5;
                    System.out.println("rechts");
                }
                
                repaint();
              
                
            }
            
            
        });
        //
        label.setFocusable(true);
        label.requestFocusInWindow();   
            
            
            
      
        int x=100;
        int y=100;
        label.setBounds(x, y, 50, 80);
        label.setIcon(new ImageIcon(Spielfeld.class.getResource("/JnR/pingu.png")));
        contentPane.add(label);
        
        Label label_1 = new Label("Bitte w\u00E4hle eine T\u00FCr. Mit den Pfeiltasten kannst du den Pinguin steuern.");
        label_1.setAlignment(Label.CENTER);
        label_1.setFont(new Font("Copperplate Gothic Light", Font.BOLD, 18));
        label_1.setBackground(Color.ORANGE);
        label_1.setBounds(12, 12, 1014, 37);
        contentPane.add(label_1);
        
        

    }
}
 

httpdigest

Top Contributor
Java:
if (e.getKeyCode() == KeyEvent.VK_UP) {
  int x = +5;            
  System.out.println("vorwärts");
}
Du deklarierst eine neue Variable `x`, weist ihr den Wert 5 zu und das wars. Diese Variable wird sonst nicht weiter verwendet und hat auch nichts mit der Position des Labels zu tun.

Ich könnte mir vorstellen, dass du sowas vorhattest:
Java:
public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_UP) {
    label.setLocation(label.getLocation().x, label.getLocation().y - 5);
    System.out.println("vorwärts");
  }
  if (e.getKeyCode() == KeyEvent.VK_DOWN) {
    label.setLocation(label.getLocation().x, label.getLocation().y + 5);
    System.out.println("rückwärts");
  }
  if (e.getKeyCode() == KeyEvent.VK_LEFT) {
    label.setLocation(label.getLocation().x - 5, label.getLocation().y);
    System.out.println("links");
  }
  if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
    label.setLocation(label.getLocation().x + 5, label.getLocation().y);
    System.out.println("rechts");
  }
  repaint();
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Auf Pfeiltasten reagieren Java Basics - Anfänger-Themen 3
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
W Pfeiltasten im Android Studio Java Basics - Anfänger-Themen 1
C Pfeiltasten? Java Basics - Anfänger-Themen 5
L Balken mit Pfeiltasten bewegen Java Basics - Anfänger-Themen 3
M Mit Pfeiltasten Textboxen durchwählen Java Basics - Anfänger-Themen 6
U Pfeiltasten abfangen Java Basics - Anfänger-Themen 2
F Pfeiltasten abfragen / Konsole Java Basics - Anfänger-Themen 4
B HSQL mit JFrame steuern Java Basics - Anfänger-Themen 4
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
W Elemente aus einer anderen GUI steuern! Java Basics - Anfänger-Themen 13
Z System(einstellungen) per Java ändern/Steuern | Betriebssystembezogen Java Basics - Anfänger-Themen 7
J GUI per Boolean steuern Java Basics - Anfänger-Themen 3
S Steuern von anderen Programmen mit java Java Basics - Anfänger-Themen 4
T Java Program über CMD öffnen und steuern Java Basics - Anfänger-Themen 1
M Rolladen/Jalousie steuern Java Basics - Anfänger-Themen 8
U Visual-Basic Programm mit Java steuern Java Basics - Anfänger-Themen 8
W Informationsabfrage durch Thread steuern Java Basics - Anfänger-Themen 9
M ein Fenster von einen anderen Steuern Java Basics - Anfänger-Themen 5
B Mit Eclipse(java) ein Java Applet im Browser steuern Java Basics - Anfänger-Themen 4
A Mit Java Mozilla/Windows steuern! Java Basics - Anfänger-Themen 3
G Java Version steuern Java Basics - Anfänger-Themen 12
S Java Programm auf remote pc steuern Java Basics - Anfänger-Themen 2
B While Schleife steuern (gelöst) Java Basics - Anfänger-Themen 2
Antoras Programmfunktionen mit Java steuern Java Basics - Anfänger-Themen 2
G Threads steuern mit wait und notify Java Basics - Anfänger-Themen 2
K Stringausgabe in Java steuern Java Basics - Anfänger-Themen 10
G Windows Steuern Java Basics - Anfänger-Themen 3
G Linux Server Steuern mit Java! Java Basics - Anfänger-Themen 5
G Programme via java steuern Java Basics - Anfänger-Themen 5
O Iterator - Durchlauf "einschränken" bzw. steuern&q Java Basics - Anfänger-Themen 2
K JProgressbar, zur laufzeit steuern Java Basics - Anfänger-Themen 7
G Andere Anwendung aus Java heraus steuern Java Basics - Anfänger-Themen 3
B Mit Java eine Website "steuern" Java Basics - Anfänger-Themen 18
D Maus steuern Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben