当前位置: 首页 > 面试题库 >

使用键盘在Java中以一定角度移动圆

邢高澹
2023-03-14
问题内容

因此,我有一个应用程序可以根据按下键盘上的哪个按钮成功地向左,向右,向上或向下移动球(椭圆)。但是,我无法使球倾斜移动。我试图通过说如果用户按住2个方向键,则球将沿对角线进入。例如,如果他们单击向左键和向上键,则我希望球沿西北方向移动。如果你们中有人发现问题的根源,我将非常感谢您的帮助!

发动机

class KeyClickListener implements KeyListener
        {
        public void keyPressed(KeyEvent e)
        {
            if (e.getKeyCode() == KeyEvent.VK_DOWN )
                {
                    component.moveCircle(1);
                }
            else if (e.getKeyCode() == KeyEvent.VK_UP)
                {
                    component.moveCircle(2);
                }
            else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    component.moveCircle(3);
                }
            else if (e.getKeyCode() == KeyEvent.VK_LEFT)
                {
                    component.moveCircle(5);
                }   
            //this is my attempt at telling whether or not the user was holding two keys
            else if (e.getKeyCode() == KeyEvent.VK_LEFT && e.getKeyCode() == KeyEvent.VK_UP)
                {
                    component.moveCircle(5);
                }
        }
        public void keyReleased(KeyEvent e){}
        public void keyTyped(KeyEvent e){}
    }

CircleComponent

 public void moveCircle(int w)
 {
    dir = w;
    if (dir == 1)
        {
            y+=20;
            repaint();
            if (y>=560)
                {
                    dir=2;
                }
        }
.  
.
.

else if (dir == 5)
        {
            x-=10;
            y-=10;
            repaint();
            if(x<=0 )
                {
                    dir=3;
                }   
        }
}

问题答案:

因为键事件将仅报告触发事件的最后一个键,所以您的最后一条if语句将永远不会起作用,因为keyCodewill仅等于触发事件的最后一个键。

相反,您应该维护每个键的“状态”并针对该状态进行处理。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestKeyListener01 {

    public static void main(String[] args) {
        new TestKeyListener01();
    }

    public TestKeyListener01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private boolean arrowUp = false;
        private boolean arrowDown = false;
        private boolean arrowLeft = false;
        private boolean arrowRight = false;

        public TestPane() {
            setFocusable(true);
            addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        case KeyEvent.VK_DOWN:
                            arrowDown = false;
                            break;
                        case KeyEvent.VK_UP:
                            arrowUp = false;
                            break;
                        case KeyEvent.VK_LEFT:
                            arrowLeft = false;
                            break;
                        case KeyEvent.VK_RIGHT:
                            arrowRight = false;
                            break;
                    }
                    repaint();
                }

                @Override
                public void keyPressed(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        case KeyEvent.VK_DOWN:
                            arrowDown = true;
                            break;
                        case KeyEvent.VK_UP:
                            arrowUp = true;
                            break;
                        case KeyEvent.VK_LEFT:
                            arrowLeft = true;
                            break;
                        case KeyEvent.VK_RIGHT:
                            arrowRight = true;
                            break;
                    }
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            FontMetrics fm = g2d.getFontMetrics();
            String text = "Up";
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() / 2) - fm.getHeight());
            draw(g2d, text, x, y, arrowUp);

            text = "Down";
            x = (getWidth() - fm.stringWidth(text)) / 2;
            y = ((getHeight() / 2) + fm.getHeight()) + fm.getAscent();
            draw(g2d, text, x, y, arrowDown);

            text = "Left";
            x = (getWidth() / 2) - fm.stringWidth(text) - 4;
            y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            draw(g2d, text, x, y, arrowLeft);

            text = "Right";
            x = (getWidth() / 2) + 4;
            y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            draw(g2d, text, x, y, arrowRight);

            g2d.dispose();
        }

        protected void draw(Graphics2D g2d, String text, int x, int y, boolean pressed) {
            g2d.setColor(pressed ? Color.BLACK : Color.GRAY);
            g2d.drawString(text, x, y);
        }
    }
}

我还建议KeyListener您使用而不是,而是使用键绑定。他们解决困扰人的烦人焦点问题KeyListener



 类似资料:
  • 问题内容: 我想使用键盘上的箭头键移动图像。当我按箭头键时,它会相应地移动。但是,我需要先单击图像才能移动它。我可以知道如何编辑代码,这样在移动图像之前无需单击图像吗?我还想知道一旦到达右侧,如何使图像从左侧出现,反之亦然。 我的代码是: 问题答案: 您已经查看了KeyBindings,否则必须嵌套,用于移动图像示例

  • 我试图创建一个游戏,在其中我可以旋转矩形,并将其向前或向后移动,当我按下右键时,它会顺时针旋转,如果我按下左键,它会逆时针旋转,但我有一个问题,如果我向上或向下移动,它只会在我按下右键和左键时旋转相同,但我预期它们会向上或向下移动,我已经看过其他的程序,并试图复制他们的方法,但我仍然错过了一些东西,有人请帮助,提前感谢 下面是我的确切代码: }

  • 问题内容: 假设我有一个(x,y)对于一条线的起点始终是相同的,并且(x,y)对于同一条线的终点是变化的。该行也总是40px长。在程序开始时,该线以垂直方向开始(称为0度)。根据用户输入,我需要通过仅更改端点(x,y)从其原点开始重画特定角度的线条。 如果需要,可以考虑使用更多食物: 我很想计算这个并使它在Java中工作。我可以使数学基于圆弧段的弧长来计算点,但是我不知道如何使Java做到这一点。

  • 问题内容: 我有一个应用程序,该应用程序在视图的下半部分具有文本字段。这意味着当我输入文本字段时,键盘将覆盖文本字段。 如何在键入时向上移动视图,以便可以看到正在键入的内容,然后在键盘消失时将其向下移动到原始位置? 我到处都看过,但是所有解决方案似乎都在Obj-C中,我还不能完全转换。 任何帮助将不胜感激。 问题答案: 这是一个解决方案,无需处理从一个textField到另一个的切换: 要解决此问

  • 我现在正在实验JavaFX,教自己如何使用箭头键移动文本和项。我做了一个程序,如果按下箭头键,就可以简单地在舞台上移动文本。 我想使一个圆圈移动我的窗格,而不是文本。要使用箭头键移动我的圆圈,我必须做哪些更改?

  • 问题内容: 我正在尝试通过keyEvent向左移动一个圆圈。到目前为止,圆已在窗口上绘制,但不会向左移动!我觉得问题是我在容器中添加了Window()构造函数。在控制台上没有输出告诉我它正在工作。因此,我认为它甚至不会到达KeyEvent类。这是我的代码: 问题答案: 实际上,这是您要添加到的内容,但重点是,因此,当您键入内容时,该内容将转到与类无关的内容。因此,为了克服它,你只需要调用的类的对象