Ich kann mit diesem Skript nicht nach links und rechts laufen (Java / Eclipse)?

ItzeKhanh  02.05.2022, 19:04

Wie sieht deine Komponente aus, an der du deinen Listener hinzufügst?

ArmolKan1321321 
Fragesteller
 02.05.2022, 19:13
Var.jf1.addKeyListener(new KeyHandler2());

2 Antworten

Zunächst das wohl Wichtigste: Vergiss dieses Konzept der Var-Klasse. Du hast es offensichtlich von einem YouTube-Tutorial, dessen Autor keine Ahnung von objektorientierter Programmierung hat. Da du nicht der erste bist, der dieses Antipattern kopiert, verweise ich einmal auf ältere Antworten, in denen ich schon ausführlicher auf dieses Problem eingegangen bin.

Nimm dir also zuerst einmal die Zeit, dein Projekt umzustrukturieren. Du wirst sowohl ohne Ablagehaufen als auch ohne static auskommen.

Auch zu deinem Vorhaben sollte ich ein Wort verlieren: Du scheinst ein Spiel programmieren zu wollen. Swing wurde allerdings nicht dafür entwickelt, Spiele zu bauen, sondern um statische Oberflächen mit klassischen Komponenten (Buttons, Menüs, etc.) zu entwerfen. Daher würde ich sehr dazu raten, stattdessen eine Bibliothek / eine Framework / o.ä. zu nutzen, welches sich auch auf die Spiele- / Grafikprogrammierung fokussiert hat (z.B. FXGL, libGDX, jMonkeyEngine, Processing Core). Du machst es dir so nur leichter.

Zu deinem Problem: In deinem KeyListener werden zwar boolsche Variablen gesetzt, doch die Logik, dass sich ein Objekt tatsächlich bewegt, wird (zumindest dort) nicht beschrieben. Was du bei deinem Listener höchstens prüfen kannst, ist, ob du bei Tastendruck die Konsolenausgaben bekommst.


ArmolKan1321321 
Fragesteller
 02.05.2022, 19:51

Ich bekomme bei der Konsolenausgabe nichts

0
regex9  02.05.2022, 20:17
@ArmolKan1321321

Vermutlich hast du noch andere Komponenten auf dem Frame, die den Fokus für sich beanspruchen. Die Key Events würden auf dem Frame erst getriggert werden, wenn dieser auch fokussiert ist.

Mit einem KeyStroke / Key Binding (statt dem Key Listener) wärst du erfolgreicher.

Beispiel:

var component = (JComponent) frame.getContentPane();
component.getInputMap().put(KeyStroke.getKeyStroke("D"), "actionForD");
component.getActionMap().put("actionForD", new AbstractAction() {
  @Override
  public void actionPerformed(ActionEvent event) {
    System.out.println("pressed d");
  }
});
0
ArmolKan1321321 
Fragesteller
 02.05.2022, 23:22
@regex9

Ich bin halt erst sehr neu in Szene!^^ und wenn ich jetzt denn KeyListener zu KeyStroke/Binding ändere wird in meiner Gui class wo alle Var codes sind, komplett rot

0
regex9  03.05.2022, 09:07
@ArmolKan1321321

Zu der Var-Klasse gibt es hier eigentlich keine große Verbindung.

Aber wie schon oben geschrieben: Nimm dir zuallererst einmal Zeit dafür, diese komplette Var-Klasse abzubauen / rauszuwerfen. Der Einsatz statischer Variablen ist nur in ausgewählten Fällen (bspw. für sichtbare Konstanten) sinnvoll. Bei deinem Projekt sollte es eine sinnvolle Aufteilung in verschiedene Klassen geben, die jeweils die für sie logischen Methoden und Eigenschaften besitzen.

Ein Programm Adressbuch hätte bspw. eine Klasse Kontakt (mit den Kontakteigenschaften), mindestens eine Klasse zur Darstellung der Oberfläche (View) und evt. noch eine eigene Klasse zur Verwaltung von Kontakten. Von den letztgenannten Klassen wird jeweils eine Instanz erstellt. Der Manager wird einmal an das View-Objekt gereicht, damit dieses ihn an Controller (Action Listener) weitergeben kann, die auf seine Methoden zugreifen.

class Contact { /* some fields with getter + setter ... */ }

class ContactManager {
  private List<Contact> contacts = new ArrayList<>;

  public void addContact(Contact contact) {
    contacts.add(contact);
  }

  public vod removeContact(Contact contact) {
    contacts.remove(contact);
  }

  public List<Contact> getContacts() {
    return contacts;
  }
}

class View {
  private final ContactManager contactManager;

  private final JTextField nameField;
  
  public View(ContactManager contactManager) {
    this.contactManager = contactManager;

    var frame = new JFrame("Contact book");
    // setup frame ...
    nameField = new JTextField();
    // add field to layout ...

    var addContactButton = new JButton("Add contact");
    addContactButton.addActionListener(event -> addContact());

    // ...
  }

  private void addContact() {
    var name = nameField.getText();
    var contact = new Contact();
    contact.setName(name);
    contactManager.addContact(contact);
  }
}

class Main {
  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      new View(new ContactManager());
    }
  }
}

Schau dir in diesem Zusammenhang das MVC-Pattern an.

0

Wiso sollte da etwas laufen.

Es wird doch nur "hello" ausgegeben.

Wenn der Text animiert sein soll dann würde ich CSS Animation verwenden


ArmolKan1321321 
Fragesteller
 02.05.2022, 19:13

Das Sysout "hello" war nur dazu da ob A u D erkannt wird

0