Java verschieben eines Kreises in eine gui mit den Pfeiltasten
Ich versuche einen Kreis mit der linken, ein keyEvent. So weit, der Kreis ist gezeichnet am Fenster, aber es bewegt sich nicht linken! Ich fühle mich wie das problem, wo füge ich das Fenster () - Konstruktor, um die container. Das ist keine Ausgabe auf der Konsole, mir zu sagen, dass es funktioniert. Also ich denke nicht, dass es noch erreicht die KeyEvent-Klasse. Hier ist mein code:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
public class Window extends JPanel {
private static Ellipse2D.Double circle;
public Window() {
super();
int width = 400;
int height = 400;
circle = new Ellipse2D.Double(0.5 * width, 0.9 * height,
0.1 * width, 0.05 * height);
addKeyListener(new MoveCircle());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponents(g);
Graphics2D brush = (Graphics2D) g;
int width = getWidth();
int height = getHeight();
g.clearRect(0, 0, width, height);
brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
brush.draw(circle);
}
public class MoveCircle implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Working on top!");
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Working on bottom!");
circle.x++;
repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
//TODO Auto-generated method stub
}
}
public static void main(String[] args) {
Window window = new Window();
JFrame frame = new JFrame();
Container container = frame.getContentPane();
container.add(new Window());
frame.addKeyEvent(window.new MoveCircle());
frame.setSize(800, 700);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich das, was passiert ist, ist diese, die Sie hinzufügen
Window
zu denJFrame
, aber der Fokus liegt bei denJFrame
, so dass, wenn Sie geben Sie auf IhremKeyboard
das Ding geht an dieJFrame
nicht dieKeyListener
befestigt, um dieWindow
Klasse. Also um es einfach zu nennenrequestFocusInWindow()
auf dieWindow
- Klasse-Objekt. Versuchen, diesen code hatte ich einige änderungen gemacht bezüglich der EDT und so.circle.x += 5;
stattnewX = circle.x + 5.0;
?circle.x += 5;
Sie die Inkrementierung der variablex
voncircle
Objekt, sonst haben Sie zu schreibencircle.x = newX;
zu machen, dass die Sache funktioniert 🙂LinePanel
, die key bindings verwendet um das problem zu vermeiden.Nur die fokussierte Komponente wird Holen Sie sich wichtige Ereignisse. Müssen Sie rufen Sie requestFocus() irgendwann.
Lösung wäre, nehmen Sie den KeyListener auf den JFrame. Auf diese Weise haben alle Tastendrücke, wirft ein Ereignis, wenn der JFrame hat den Fokus.
Window window = new Window(); container.add(window); frame.addKeyListener(window.new MoveCircle());