Wie verwende ich KeyListener mit JFrame?

Lesezeit: 5 Minuten

Wie verwende ich KeyListener mit JFrame
Benutzer3183679

Also habe ich versucht, ein Rechteck mit a zu bewegen KeyEvent (KeyListener) und immer wenn ich versuche, die Taste zu drücken, bewegt sich das Rechteck nicht.

Das Rechteck wird gezeichnet, aber immer wenn ich das drücke left und right Schlüssel passiert nichts. Ich habe zwei Klassen, eine ist meine Hauptklasse mit den KeyEvents und dem Rahmen und die andere zeichnet das Rechteck und enthält die Funktion zum Verschieben des Rechtecks.

Hier ist mein Code:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;


public class mainFrame extends JFrame implements KeyListener{

mainDraw Draw = new mainDraw();

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if(key == KeyEvent.VK_D){

        Draw.moveRight();
    }
}

public void keyReleased(KeyEvent e) {


}
public void keyTyped(KeyEvent e) {}

public mainFrame()
{
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public static void main(String[] args) {

    mainFrame M1 = new mainFrame();

    mainDraw Draw = new mainDraw();

    JFrame frame = new JFrame("Square Move Practice");


    //frame
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setSize(600, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(Draw);

}
}

Und jetzt die zweite Klasse:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;

public class mainDraw extends JComponent{

public int x = 50;
public int y = 50;

public void paint(Graphics g){

    g.drawRect(x, y, 50, 50);
    g.fillRect(x, y, 50, 50);
    g.setColor(Color.BLACK);
}

public void moveRight()
{
    x = x + 5;
    y = y + 0;
    repaint();
}

}

Bitte sagen Sie mir, wie ich das Rechteck verschieben kann. Vielen Dank im Voraus!

Das Rechteck bewegt sich nicht, weil Sie es nicht verwenden JFrame korrekt. Du musst zuweisen frame zu new mainFrame() anstatt das Instanziierte zu ignorieren mainFrame Objekt.

Es gibt mehrere andere Probleme, wie @MadProgrammer betont.

Hier ist der Code, der einige der Probleme behebt:

mainFrame.java

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;


public class mainFrame extends JFrame implements KeyListener{
    private mainDraw draw;

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

    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()== KeyEvent.VK_RIGHT)
            draw.moveRight();
        else if(e.getKeyCode()== KeyEvent.VK_LEFT)
            draw.moveLeft();
        else if(e.getKeyCode()== KeyEvent.VK_DOWN)
            draw.moveDown();
        else if(e.getKeyCode()== KeyEvent.VK_UP)
            draw.moveUp();

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

    public mainFrame(){
        this.draw=new mainDraw();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                mainFrame frame = new mainFrame();
                frame.setTitle("Square Move Practice");
                frame.setResizable(false);
                frame.setSize(600, 600);
                frame.setMinimumSize(new Dimension(600, 600));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(frame.draw);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

mainDraw.java

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;

public class mainDraw extends JComponent {

    public int x = 50;
    public int y = 50;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(x, y, 50, 50);
        g.fillRect(x, y, 50, 50);
        g.setColor(Color.BLACK);
    }

    public void moveRight() {
        x = x + 5;
        repaint();
    }

    public void moveLeft() {
        x = x - 5;
        repaint();
    }

    public void moveDown() {
        y = y + 5;
        repaint();
    }

    public void moveUp() {
        y = y - 5;
        repaint();
    }
}

Übrigens, verwenden SwingUtilities um den GUI-Update-Code zu setzen, da Swing-Objekte nicht Thread-sicher sind.

Wie verwende ich KeyListener mit JFrame
Verrückter Programmierer

Es gibt mindestens drei Probleme…

Zuerst…

Dein mainFrame Klasse extends von JFrameaber in Ihrem main -Methode erstellen Sie eine Instanz davon und ignorieren sie, indem Sie Ihre eigene erstellen JFrame.

Die KeyListener ist in der Instanz von registriert mainFramewas bedeutet, dass es ignoriert wurde.

Du solltest loswerden extends JFrame da es nur das Problem verwirrt

Zweitens…

KeyListener reagiert nur auf Schlüsselereignisse, wenn die Komponente, für die es registriert ist, fokussierbar ist UND direkten Fokus hat, dies macht es unzuverlässig.

Stattdessen sollten Sie die verwenden Tastenbelegungs-API mit dem Draw Panel, dies ermöglicht es Ihnen, die Fokusprobleme zu überwinden.

Drittens…

Sie haben die Farbkette unterbrochen, dh wenn sich das Rechteck bewegt, bleibt das, was zuvor gemalt wurde, immer noch erhalten.

Auf eine Überschreibung sollten Sie verzichten paint und stattdessen verwenden paintComponent. Es gibt viele Gründe dafür, aber im Allgemeinen malt es im Hintergrund, wird als Aktualisierung von untergeordneten Komponenten bezeichnet.

Stellen Sie schließlich sicher, dass Sie anrufen super.paintComponent bevor Sie etwas anderes tun, um sicherzustellen, dass Graphics Kontext wird zum Malen vorbereitet

Schauen Sie sich an Durchführen von kundenspezifischer Malerei für mehr Details

Sie sollten Ihren Listener in der mainDraw-Klasse hinzufügen, nicht Ihren mainFrame.

Es empfiehlt sich, Tasten- und Mausereignisse in Frames und Windows nicht zu behandeln.

Ö/

Ich habe versucht, Shortcut-Listener für den gesamten Frame zu implementieren, und es ist mir nicht gelungen, endlich einen Weg gefunden. Wenn Sie den Listener auch dann festlegen möchten, wenn der Fokus auf einer anderen Komponente liegt, müssen Sie allen Komponenten Listener hinzufügen.

Hier ist mein Code,

Rufen Sie dies in Ihrem Konstruktor auf:

setShortcutListener(this); // this = JFrame when you call in in constructor

Methode setShortcutListener (JFrame-Frame) :

private void setShortcutListener(JFrame frame) {
    List<Component> comp_list = Common.getAllComponents(frame);
    for (Component component : comp_list) {
        component.addKeyListener(getShortcutKeyListener());
    }
}

Methode getAllComponents(frame); Class Common ist nur eine Klasse,

public static List<Component> getAllComponents(final Container c) {
    Component[] comps = c.getComponents();
    List<Component> compList = new ArrayList<Component>();
    for (Component comp : comps) {
        compList.add(comp);
        if (comp instanceof Container) {
            compList.addAll(getAllComponents((Container) comp));
        }
    }
    return compList;
}

Methode getShortcutKeyListener() :

public static KeyListener getShortcutKeyListener() {
    KeyListener listener = new KeyListener() {

        @Override
        public void keyReleased(KeyEvent evt) {
            if (evt.getKeyCode() == KeyEvent.VK_F3) {
                // What you do when F3 key pressed
            } else if (evt.getKeyCode() == KeyEvent.VK_F2) {
                // What you do when F2 key pressed
            } 
        }

        @Override
        public void keyTyped(KeyEvent e) {
            // Do nothing
        }

        @Override
        public void keyPressed(KeyEvent e) {
            // Do nothing
        }
    };
    return listener;
}

Ich denke, wir haben einfache Möglichkeiten als diese, aber dieser Code funktioniert genau wie erwartet. Key Listener funktioniert überall in Form.

Hoffe, diese Antwort wird jemandem helfen. Danke.

994830cookie-checkWie verwende ich KeyListener mit JFrame?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy