use*_*679 11 java animation swing jframe
所以,我试图使用KeyEvent(KeyListener)进行矩形移动,每当我尝试按下键时,矩形都不会移动.
绘制矩形,但每当我按下left和right键时,都没有任何反应.我有两个类,一个是带有keyEvents和框架的主类,另一个是绘制矩形并保存移动矩形的函数.
这是我的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在是第二堂课:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何移动矩形.提前致谢!
小智 8
由于您使用不JFrame正确,矩形不会移动.你必须分配frame到new mainFrame()的不是忽略实例化mainFrame对象.
@MadProgrammer指出,还有其他几个问题.
以下是修复某些问题的代码:
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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,用于SwingUtilities放置gui更新代码,因为swing对象不是线程安全的.
至少有三个问题......
你的mainFrame类extends从JFrame,但在你的main方法,你创建它的一个实例,并忽略它,通过创建自己的JFrame.
该KeyListener注册到的情况下mainFrame,这意味着,它被忽略.
你应该摆脱extends JFrame它,因为它只是混淆了这个问题
KeyListener 只有当注册的组件是可聚焦的且具有直接焦点时才会响应关键事件,这使得它不可靠.
相反,您应该使用键绑定API与Draw面板,这将允许您解决焦点问题.
你已经破坏了油漆链,这意味着当矩形移动时,之前绘制的内容仍将保留.
你应该避免重写paint,而是使用paintComponent.这有很多原因,但一般来说,它在后台绘制,称为子组件的更新.
最后,确保super.paintComponent在进行任何其他操作之前进行调用,以确保Graphics为绘画做好准备
看看演出风俗绘画更多细节