JFrame 中的 Java 移动问题

标签 java swing jframe jpanel keylistener

我编写了一个程序,其中 JFrame 中有一个绿色方 block ,您可以按“A”和“D”键左右移动(A=左,D=右)。但是当我运行程序时,按下 A/D 键时方 block 不会移动。我尝试检查我的代码是否有错误,但找不到任何错误。如果你能告诉我我的代码哪里错了那就太棒了!!

import java.awt.event.*;
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;

    public class four extends JPanel implements ActionListener,KeyListener {
    private static final long serialVersionUID = 1L;  
    static int x=0, y=0;  
    static int x1=0, y1=0;  
    static int width=500,height=600;        
    static JFrame f;  
    boolean left, right;  
    boolean playGame = true;

public void paintComponent (Graphics g){        
    g.setColor(Color.black);
    g.drawRect(x,100,700,100);
    g.drawRect(x,200,700,100);
    g.drawRect(x,300,700,100);
    g.drawRect(x,400,700,100);
    g.drawRect(x,500,700,100);
    g.drawRect(x,600,700,100);
    g.drawRect(x,700,700,100);
    g.drawRect(100,100,100,700);
    g.drawRect(200,100,0,700);
    g.drawRect(300,100,0,700);
    g.drawRect(400,100,0,700);
    g.drawRect(500,100,0,700);
    g.drawRect(600,100,0,700);
    g.setColor(Color.green);
    g.fillRect(x1, y1, 100, 100);
}
public static void main(String[] args){  
    four q=new four();
    JFrame f=new JFrame("Connect 4");
    q.init(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(q);
    f.setSize(700,820);
    f.setVisible(true);
} 
public void init (){
    this.addKeyListener(this);  
    setFocusable(true);  

}
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

    if (left==true)             
    {
        x1=x1-100;
    }
    if (right==true)             
    {
        x1=x1+100;
    }
    f.repaint();
    System.out.println(x1);
    }

@Override
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    if (e.getKeyCode()==KeyEvent.VK_A){  
        left=true;
    }
    if (e.getKeyCode()==KeyEvent.VK_D){  
        left=true;
    }
}
@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    if (e.getKeyCode()==KeyEvent.VK_A){  
        left=false;
    }
    if (e.getKeyCode()==KeyEvent.VK_D){  
        right=false;
    }
}
@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}

最佳答案

  1. 在执行任何自定义绘制之前调用 super.paintComponent
  2. KeyListener 上使用键绑定(bind) API,它解决了 KeyListener 所遇到的与焦点相关的问题。请参阅How to Use Key Bindings了解更多详情
  3. 从事件调度线程的上下文中初始化 UI。请参阅Initial Threads了解更多详情
  4. 什么在调用 actionPerformed 方法?我想你想仔细看看How to use Swing Timers

关于JFrame 中的 Java 移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462907/

相关文章:

java - 从 Active Directory 中删除用户

java - 我在哪里可以找到 JDK 8 中的 derby.jar?

java - 扩展 JLabel 的 Draw 类

java - 在 Java JFrame 上添加图像 - Netbeans

java - 隐式和显式 ArrayList 大小声明之间的区别?

java - 自包含数组深等于

java - JPanel 和 CardLayout 出现 NullPointerException 错误

java - 如何从一个jpanel到另一个jpanel画一条线

Java:单击第一帧的按钮时创建第二帧

Java 文本和颜色(0, 0, 0, 0)