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

在围绕屏幕移动球的情况下,如何正确处理JComponent的按键和重绘?

燕博文
2023-03-14
问题内容

我以为我会尝试编写一个可以绘制球的程序,并在按下箭头键时将球沿着屏幕上的方向移动。首先,我开始尝试制作一个仅执行“向上”箭头键移动的程序

我一直在寻找解决方案,但无法弄清楚这段代码有什么问题。我不知道这是我的输入和动作图出现问题(即程序识别按键的问题)还是JComponent和JFrame类如何在摆动中工作的问题。我以为也许这个问题也可能是重点。我真的不知道如何分辨组件何时具有焦点。我认为该键已设置为CNTRL
+ Y而不是暂时设置为上,只是因为在某些时候我认为这可能是因为我的字符串在输入映射器中指定了向上箭头。

在这一点上,我很沮丧,我只是想让该死的事情去 做某事 ,所以我使用的输入映射超出了必要。

代码如下,它很短,格式很糟糕(对不起):

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

class BallMover
{
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                BallFrame frame = new BallFrame();
            }
        });

    }
}


class BallFrame extends JFrame
{
    private static final int DEFAULT_WIDTH = 500;
    private static final int DEFAULT_HEIGHT = 500;
    private BallComponent comp;

    public BallFrame()
    {
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        super.setSize(this.DEFAULT_WIDTH, this.DEFAULT_HEIGHT);
        super.setResizable(false);
        super.add(new BallComponent());
        super.setVisible(true);
        super.setFocusable(true);
    }
}


class BallComponent extends JComponent
{
    private Ellipse2D.Double ellipse;
    private double x = 225;
    private double y = 225;
    private ActionPress actionPress;

    public BallComponent()
    {
        super();
        super.setFocusable(true);

        InputMap imap1 = this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp1");
        InputMap imap2 = this.getInputMap(JComponent.WHEN_FOCUSED);
        imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp2");
        InputMap imap3 = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);   
        imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp3");

        ActionMap amap = this.getActionMap();
        amap.put("keyUp1", actionPress);
        amap.put("keyUp2", actionPress);    
        amap.put("keyUp3", actionPress);
    }

    public void paintComponent(Graphics g)
    {
        super.repaint(); // clear component //
        Graphics2D g2d = (Graphics2D)g;
        this.ellipse = new Ellipse2D.Double(x, y, 50, 50);
        g2d.fill(this.ellipse);
    }

    private class ActionPress extends AbstractAction
    {
        public void actionPerformed(ActionEvent event)
        {
            y = y + 10;
            ellipse = new Ellipse2D.Double(x, y, 50, 50);
            repaint();
        }
    } 
}

问题答案:

似乎您从未初始化过actionPress-尝试将其添加到BallComponent构造函数中:

actionPress = new ActionPress();

即,您的构造函数将如下所示

public BallComponent()
{
    super();
    super.setFocusable(true);

    InputMap imap1 = this.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp1");
    InputMap imap2 = this.getInputMap(JComponent.WHEN_FOCUSED);
    imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp2");
    InputMap imap3 = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);   
    imap1.put(KeyStroke.getKeyStroke("ctrl Y"), "keyUp3");

    actionPress = new ActionPress();
    ActionMap amap = this.getActionMap();
    amap.put("keyUp1", actionPress);
    amap.put("keyUp2", actionPress);    
    amap.put("keyUp3", actionPress);
}


 类似资料:
  • 问题内容: 我“d成的运行Django的服务器,我不能简单地和出来。 是否有其他摆脱困境的方法? 目前,我手动关闭本地PC上的选项卡,然后再重新打开,但这变得很烦人。 问题答案: 或 。请参阅屏幕手册#分离。

  • 我正在尝试构建一个自动化脚本来安装chrome扩展。 在我的本地系统(windows 10)上,当使用java的Robot类时,所有这些都可以正常工作,因为我有一个物理键盘连接到我的计算机。 问题是——当我试图在虚拟机(亚马逊EC2,视窗服务器)上运行这种自动化时,机器人类不起作用,因为它无法检测键盘的物理连接。 有没有其他方法可以在不连接键盘的情况下模拟键盘行程? 仅供参考,我必须使用键盘,因为

  • 我使用async/await ecma6标准,没有任何自定义库。 我现在不知道如何正确地捕捉和抛出错误。我有多个async/await函数,如果下面某个地方发生了严重错误,我希望将错误抛出到所有async函数的顶部,并停止函数的执行。 我试图抛出异常的异步/等待函数,并抓住它在目标函数,但我得到一个错误,在node.js: (节点:13964)未处理的PromisejectionWarning:未

  • 我正在尝试使用ARCore在屏幕上不点击的情况下显示对象。在Google提供的ARCore Sceneform的基本示例中,您需要在屏幕检测到表面后点击屏幕。 我想实现这一点,AR在不点击屏幕的情况下显示对象。 我试着在不点击屏幕的情况下进行显示。 如果有人知道怎么做,请帮助我。提前感谢

  • 我正在尝试使用selenium创建自动化,以安装chrome扩展。当我尝试在amazon虚拟机上运行这个jar时,我遇到了一个问题,因为当我尝试用robot类按enter键时,它不起作用,因为我没有连接物理键盘。我不能在selenium中使用sendkeys,因为来自google的pop不在同一页面,selenium无法识别它。有什么解决办法吗?

  • 我真的需要一些帮助,我被卡住了。我试图在一个简单的游戏中让一个方块成为地面,另一个方块落在上面,然后可能会反弹一点,但是能够向左或向右移动盒子,从第一个方块上掉下来。有人能帮我吗? 对于任何对答案感兴趣的人,感谢PoprostuRonin和dermetfan的YouTube视频,我能够得到我正在寻找的结果,你可以在你的项目中尝试下面的代码,只需更改精灵纹理。