【问题标题】:Java Graphics 2D and KeyListenerJava 图形 2D 和 KeyListener
【发布时间】:2015-01-05 10:46:58
【问题描述】:

我现在正在用 Java 自学 2D 图形。我正在尝试创建一个积木游戏。到目前为止,我能够让第一行移动和停止,但我的目标是在第一行下方生成一个新行第一行保持原位。我觉得解决这个问题是一个我还没有学过的简单概念。但是,我们将不胜感激任何建议。如果您想指出我可以自学 2D 图形的正确方向,我也将不胜感激。

我的 JFrame 代码如下:

public class  BlockStacker extends JFrame {
public class AL extends KeyAdapter {
    stack2 s2 = new stack2();
    public void keyPressed(KeyEvent e){
        int keyCode = e.getKeyCode();
    }

}
public static void main(String[] args){
    stack2 s = new stack2();
    JFrame f = new JFrame();
    f.add(s);
    f.setVisible(true);
    f.setSize(1920, 1080);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setTitle("Block Stacker");


}

}

带有图形和按键监听器的代码是这样的:

public class stack2 extends JPanel implements ActionListener, KeyListener{
    Timer t = new Timer(250, this);
    double x, y, velX = 253;


    public stack2() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        setBackground(Color.BLACK);
        Color blue = new Color(0,0,255);
        g2.setColor(blue);

        Rectangle2D.Double rectangle = new Rectangle.Double(x + 210, y, 200, 100);
        g2.fill(rectangle);

        Rectangle2D.Double rectangle2 = new Rectangle.Double(x, y, 200, 100);
        g2.fill(rectangle2);

        Rectangle2D.Double rectangle3 = new Rectangle.Double(x + 420, y, 200, 100);
        g2.fill(rectangle3);

    }

    public void actionPerformed(ActionEvent e) {
        if (x < 0) {
            velX = -velX;
        }

        x += velX;
        repaint();

        if (x < 10 || x > 1200) {
          velX = -velX;
          repaint();
        }
    }

    public void space() {
        velX = 0;
        repaint();

    }
public void space2() {


    }


public void keyPressed(KeyEvent e) {
  int code = e.getKeyCode();
     if (code == KeyEvent.VK_SPACE) {
       space();
            }
 }     

public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
    if (code == KeyEvent.VK_SPACE) {
        space2();
    }
}

}

【问题讨论】:

标签: java graphics 2d actionlistener keylistener


【解决方案1】:

有多个问题...

  1. 您将 KeyListener 附加到 JFrame,但 JFrame 有一个 JRootPane、内容窗格以及它与用户之间的内容,这些组件中的任何一个都可能具有键盘焦点,从而阻止框架接收键事件
  2. 您在 KeyAdapter 和框架中都创建了 Stack 实例,因此您尝试更改的 Stack 实例不是屏幕上显示的版本
  3. KeyListener 仅在其注册的组件具有焦点且具有焦点时才响应关键事件...

改用键绑定?见How to use key bindings

【讨论】:

  • 感谢您的回答。我会考虑自学按键绑定。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 2020-02-24
  • 2010-12-20
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多