Swing JButton mit Pfeiltasten bewegen

Abgeleitet

Mitglied
Hallo,
ich bin noch ein relativer Anfänger in Java und versuche nun anhand einiger Projekte mich zu verbessern und Java zu lernen. Ich habe versucht, einen JButton zu erstellen, den ich dann mit den Pfeiltasten bewegen kann. Es wird auch der Button erzeugt nur leider lässt sich dieser nicht bewegen. Falls einer eine Ahnung hat, woran das liegt wäre ich sehr dankbar 🙂



Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.*;
import javax.swing.*;

import javax.swing.JFrame;

public class Test2 extends JFrame implements KeyListener {

    public JFrame Oberfläche;
    
    public JButton MO;
    
    
    
    
    
    public Test2() {
        Oberfläche = new JFrame("Oberfläche");
        Oberfläche.pack();
        Oberfläche.setLayout(null);
        Oberfläche.getContentPane().setBackground(null);
        Oberfläche.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Oberfläche.setVisible(true);
        Oberfläche.setSize(200,200);
        
        MO = new JButton("Move me");
    
        MO.setBackground(Color.RED);
        MO.setBounds(100,100,30,30);
        
        MO.setVisible(true);
        Oberfläche.add(MO);
        
    }
    public static void main(String[] args) {
        new Test2();
    }
    public void keyTyped(KeyEvent e) {
        System.out.println("Key pressed");
    }
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            MO.setLocation(MO.getLocation().x, MO.getLocation().y -5);
            
        }
        else if
            
        (e.getKeyCode() == KeyEvent.VK_LEFT){
            MO.setLocation(MO.getLocation().x -5, MO.getLocation().y);
        }
        else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
            MO.setLocation(MO.getLocation().x, MO.getLocation().y+5);
        }
        
        else if(e.getKeyCode() == KeyEvent.VK_UP) {
            MO.setLocation(MO.getLocation().x, MO.getLocation().y -5);
        }
        
    if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
        MO.setLocation(1000,1000);
    }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
    
    }
 
Könnten sie mir eventuell erläutern, was genau ich hinzufügen müsste und warum.
Erstmal sind wir hier per Du.

Dann noch zwei Dinge zum Code. In Java schreibt man per Konvention Variablen-/Parameter- und Methodennamen in lowerCamelCase, Namen von Typen (class, interface, enum) in UpperCamelCase; daran solltest Du Dich gewöhnen und halten. Umlaute sind auch nicht gut im Code. Das "extends JFrame" solltest Du Dir sparen; Du willst keine Klasse schreiben, die von JFrame ableitet, Du willst JFrame lediglich benutzen.

Jetzt zur Frage: wenn ein Tasten-Ereignis ausgelöst wird (z. B. durch einen Tastendruck), dann wird dieses Ereignis an die Komponente weitergeleitet, die a) fokussierbar ist und b) den Fokus besitzt. Das wäre in Deinem Fall der JButton.

Der JButton "weiß" also, dass eine Taste gedrückt wurde und kann darauf reagieren (z. B. löst die Leertaste in der Regel die Aktion des Buttons aus). Du willst jetzt irgendwie an das Ereignis herankommen. Das kannst Du dem Button "sagen", in dem Du einen sog. Listener bei Deinem Button registrierst. Der Button informiert alle registrierten Listener über das entsprechend eingetretene Ereignis. Es gibt verschiedene Arten von Listener, in Deinem Fall ist es ein KeyListener (weil: Tasten-Ereignis), den Du in Deiner Klasse Test2 bereits implementiert hast.

Du kannst also das aktuelle Objekt (this), das ja einen KeyListener implementiert, beim Button als KeyListener mittels MO.addKeyListener(this); anmelden.

Hier mal ein klein wenig überarbeiteter Code:
Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.*;
import javax.swing.*;

import javax.swing.JFrame;

public class Test2 implements KeyListener {

    public JFrame oberflaeche;
    public JButton move;
    
    public Test2() {
        move = new JButton("Move me");
    
        move.setBackground(Color.RED);
        move.setBounds(100,100,30,30);
        
        move.setVisible(true);

        oberflaeche = new JFrame("oberflaeche");
        oberflaeche.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        move.addKeyListener(this);

        oberflaeche.getContentPane().setLayout(null);
        oberflaeche.add(move);
        oberflaeche.setSize(200,200);
        oberflaeche.setVisible(true);
    }

    public static void main(String[] args) {
        new Test2();
    }

    public void keyTyped(KeyEvent e) {
        System.out.println("Key pressed");
    }
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            move.setLocation(move.getLocation().x, move.getLocation().y -5);
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT){
            move.setLocation(move.getLocation().x -5, move.getLocation().y);
        } else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
            move.setLocation(move.getLocation().x, move.getLocation().y+5);
        } else if(e.getKeyCode() == KeyEvent.VK_UP) {
            move.setLocation(move.getLocation().x, move.getLocation().y -5);
        }
 
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            move.setLocation(1000,1000);
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
 

Zurück
Oben