如何在 KeyListener 中调用图形方法?

Posted

技术标签:

【中文标题】如何在 KeyListener 中调用图形方法?【英文标题】:How do I call Graphics Method inside KeyListener? 【发布时间】:2018-06-19 17:11:48 【问题描述】:

提前,我想说有很多类似的帖子,但是,它们都不适用于我,或者它们实际上都没有任何答案,并且已经过时了,这意味着可能会有新的java可以帮助我解决问题的功能。

无论如何,我想制作一个有网球拍的游戏。当然,他们必须轮换。为了旋转,我必须在 KeyListener 中调用我的 Graphics2D 方法。如果不在我的关键侦听器方法中添加新的 Graphics2D 变量,我将如何做到这一点?

以下是我实现这一目标的所有方法:

        public void draw(Graphics2D g2d) 
            g2d.drawImage(getPaddleImg(), x, y, null);
        

        public static Image getPaddleImg() 
            ImageIcon ic = new ImageIcon("C:/Users/Elliot/Desktop/Eclipse Game Tennis/paddle.png");
            return ic.getImage();
        

        public void keyPressed(KeyEvent e) 
            int key = e.getKeyCode();

            if(key==KeyEvent.VK_W)
                g2d.rotate(Math.toRadians(5));
             else if(key==KeyEvent.VK_W) 
                g2d.rotate(Math.toRadians(-5));
            

        public void keyReleased(KeyEvent e) 
            int key = e.getKeyCode();

            if(key==KeyEvent.VK_W)
                g2d.rotate(Math.toRadians(0));
             else if(key==KeyEvent.VK_W) 
                g2d.rotate(Math.toRadians(0));
            
        

我知道,由于KeyPressed()KeyReleased() 方法内部的g2d,这段代码会给我一个错误。我如何在这两种方法中调用g2d?或者我如何在 draw() 方法中做同样的事情?

【问题讨论】:

【参考方案1】:

错误方式:可以使用Component.getGraphics()获取图形对象。

正确的方法:所有的绘画都应该在paint(Component)方法内完成。这是因为用户可以随时调整/打开/关闭窗口。在您的KeyListener(也研究键绑定)中,您应该更新有关如何绘制球员/球拍的设置,然后调用repaint()

【讨论】:

我知道,但是如何访问g2d 变量?感谢您的帮助,但这无助于解决我在方法中获取变量的问题,除非我使用“错误”的方式 所有(根据我的经验)图形对象都可以转换为 Graphics2D 你的意思是(Graphics2D) g 其中gGraphics 变量吗? 是的,我就是这个意思 实际上我之前在我的代码中使用过它,但是当我已经有一个 Graphics2D 变量时,这有什么帮助【参考方案2】:

好的!其实是我自己想出来的!我所做的在我的draw() 方法中被称为g2d.rotate(.....)。我所做的是创建检查旋转的变量,并在我的KeyPressed() 方法中将它们设置为真或假。这是我在draw() 方法中使用的代码:

 if(isRotatingPositive == true) 
    g2d.rotate(Math.toRadians(speed));
  else if(isRotatingNegative == true) 
    g2d.rotate(Math.toRadians(-speed));
 

【讨论】:

以上是关于如何在 KeyListener 中调用图形方法?的主要内容,如果未能解决你的问题,请参考以下文章

KeyListener 多久检查一次键盘输入? (Java 图形用户界面)

在 Swing 中使用 KeyListener 的 3 种方法时感到困惑?

如何在 Java 中正确使用 keyListener

十. 图形界面(GUI)设计14.键盘事件

Swing的KeyListener和多个键同时按下

Java KeyListener:KeyTyped Backspace,Esc 作为输入