Я пытаюсь изучить анимацию на Java и хочу создать рамку, которая отображает строку и анимирует эту строку так, чтобы она перемещалась по экрану, управляемому клавишами со стрелками, и обеспечивала его нахождение за границами экрана.
Я уже сделал то же самое с мышью, но я не могу сделать это с помощью клавиш со стрелками
package Draw;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class DrawMouse extends JPanel implements MouseListener, MouseMotionListener, KeyListener
{
int x, y;
String s = "Drag this around";
boolean click, drag, mouseInside, insideR1, insideR2, insideR3;
//create 3 rectangle objects
Rectangle r1 = new Rectangle (20, 70, 80, 100);
Rectangle r2 = new Rectangle (110, 70, 80, 100);
Rectangle r3 = new Rectangle (200, 70, 80, 100);
// create the fonts once and use them when needed
Font bigFont = new Font ("Helvetica", Font.BOLD, 45);
Font size12 = new Font ("Helvetica", Font.BOLD, 12);
Font size14 = new Font ("Helvetica", Font.PLAIN, 14);
public DrawMouse ()
{ // add the listener to the panel
addMouseListener (this);
addMouseMotionListener (this);
this.addKeyListener (this);
setFocusable (true); // need this to set the focus of the mouse
}
//generates only one event for each pressed-released combination
public void mouseClicked (MouseEvent e)
{
// use this for click and release
}
public void mouseEntered (MouseEvent e)
{
mouseInside = true;
repaint ();
}
public void mouseExited (MouseEvent e)
{
mouseInside = false;
click = false;
repaint ();
}
public void mousePressed (MouseEvent e)
{
click = true;
drag = false;
repaint ();
}
public void mouseReleased (MouseEvent e)
{
click = false;
drag = false;
repaint ();
}
public void mouseDragged (MouseEvent e)
{
drag = true;
x = e.getX ();
y = e.getY ();
repaint ();
}
public void mouseMoved (MouseEvent e)
{
x = e.getX ();
y = e.getY ();
//"contains" is a method of the Rectangle class
if (r1.contains (x, y))
insideR1 = true;
else
insideR1 = false;
if (r2.contains (x, y))
insideR2 = true;
else
insideR2 = false;
if (r3.contains (x, y))
insideR3 = true;
else
insideR3 = false;
repaint ();
}
public void keyTyped (KeyEvent e)
{
s = s + e.getKeyChar (); // append the character to the string
}
public void keyReleased (KeyEvent e)
{
repaint ();
}
public void keyPressed (KeyEvent e)
{
char key = (char) e.getKeyCode ();
if (key == e.VK_ESCAPE)
System.exit (0);
else if (key == e.VK_ENTER) // ENTER clears the sentence
s = "";
}
public void drawStuff (Graphics g)
{
//if mouse was clicked, background magenta, otherwise black
if (click)
{
g.setColor (Color.magenta);
}
else
{
g.setColor (Color.black);
}
g.fillRect (0, 0, size ().width, size ().height);
//paint the 3 rectangles
g.setColor (Color.blue);
g.fillRect (r1.x, r1.y, r1.width, r1.height);
g.setColor (Color.green);
g.fillRect (r2.x, r2.y, r2.width, r2.height);
g.setColor (Color.red);
g.fillRect (r3.x, r3.y, r3.width, r3.height);
g.setFont (size12);
g.setColor (Color.white);
if (drag)
g.drawString (s, x, y);
else
g.drawString (s, 20, 200);
//draw the mouse coordinates
if (mouseInside)
{
g.setColor (Color.white);
g.drawString ("X: " + x, 30, 30);
g.drawString ("Y: " + y, 30, 50);
}
else
{
g.setFont (size14);
g.setColor (Color.orange);
g.drawString ("Move the mouse inside the window!", 40, 30);
}
if (insideR1)
{
g.setFont (bigFont);
g.setColor (Color.blue);
g.drawString ("BLUE", 120, 50);
g.setColor (Color.white);
g.drawRect (r1.x, r1.y, r1.width - 1, r1.height - 1);
}
if (insideR2)
{
g.setFont (bigFont);
g.setColor (Color.green);
g.drawString ("GREEN", 120, 50);
g.setColor (Color.white);
g.drawRect (r2.x, r2.y, r2.width - 1, r2.height - 1);
}
if (insideR3)
{
g.setFont (bigFont);
g.setColor (Color.red);
g.drawString ("RED", 120, 50);
g.setColor (Color.white);
g.drawRect (r3.x, r3.y, r3.width - 1, r3.height - 1);
}
}
public void paintComponent (Graphics g)
{
super.paintComponent (g);
drawStuff (g);
}
public static void main (String[] args)
{
JFrame frame = new JFrame ("DrawMouse");
frame.getContentPane ().add (new DrawMouse ());
frame.setSize (300, 300);
frame.setVisible (true);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
}
Я ожидаю получить тот же вывод, но переместить строку с помощью клавиш со стрелками не с мышью