【问题标题】:java graphics updatejava图形更新
【发布时间】:2012-01-07 12:03:03
【问题描述】:

我正在尝试用 java 制作一个简单的 ascii 游戏,但我无法让图形在按键时更新

我试图让它用箭头键控制这个家伙

代码如下

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.Timer;


public class shooter extends JFrame{
    int x = 100, y = 100, dx, dy;
    Timer time;
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public void move(){
        x = x + dx;
        y = y + dx;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }

    public shooter() {
        setTitle("title of gip");
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        //keep at bottom
        setVisible(true);
        //dont code here >:(
    }

    ///////////GRAPHICS ////////////////////
    public void paint(Graphics g){
        g.clearRect(0, 0, getWidth(), getHeight());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.drawString("☺", getX(), getY());
    }
    public void paintComponent(Graphics g){

    }
    //////////////end of graphics//////////////

    public void keyPressed(KeyEvent e){
        int pressed = e.getKeyCode();
        if (pressed == KeyEvent.VK_LEFT){
            dx = -1;
        }
        if (pressed == KeyEvent.VK_RIGHT){
            dx = 1;
        }
    }
    public void keyReleased(KeyEvent e){
        int rel = e.getKeyCode();
        if (rel == KeyEvent.VK_LEFT){
            dx = 0;
        }
        if (rel == KeyEvent.VK_RIGHT){
            dx = 0;
        }
    }
    public void actionPerformed(ActionEvent e) {
        move();
        repaint();
    }
    public static void main(String[] args){
        new shooter();


    }

} 

请帮忙 谢谢

【问题讨论】:

    标签: java swing graphics ascii


    【解决方案1】:

    您尚未在框架中添加任何动作侦听器。当这些事件发生时,按键按下和动作执行方法会被调用,但只能从带有动作监听器或键监听器的对象调用。

    查看http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

    简而言之,尽管您需要以下内容,public class TryItOut extends JFrame implements ActionListener,KeyListener{ 以及构造函数中的 addActionListener(this);addKeyListener(this);

    这样做,然后从那里尝试。

    【讨论】:

      【解决方案2】:

      @dann.dev 很好地发现了这个问题。您没有将击键和事件连接到主框架。 另外,我只想评论一下您绘制场景的方式。您应该在 JPanel 中绘制而不是 JFrame,如果您愿意在主框架中添加按钮和菜单,这将使您的生活更轻松。

      覆盖并绘制paintComponent 而不是paint

      class DrawingPanel{
          // ....
          @Override
          public void paintComponent(Graphics g){
              g.clearRect(0, 0, getWidth(), getHeight());
              g.fillRect(0, 0, getWidth(), getHeight());
              g.setColor(Color.white);
              g.drawString("☺", getX(), getY());
          }
          // ....
      }
      

      完成后,将此面板设置为框架的内容窗格。

      frame.setContentPane(new DrawingPanel());
      

      【讨论】:

      • GETah 同意。用户,您设置程序的方式看起来不错,但我认为您可能会遇到一些麻烦,抱歉我现在没有时间仔细阅读它,请尝试阅读“Killer Java 游戏编程”它有一些很棒的信息和一个很好的框架,可以以恒定的 fps 绘制到屏幕上
      • +!,用于在 JPanel 上绘图并覆盖 paintComponent()。
      【解决方案3】:

      1) 从键盘监听按键事件最好实现KeyBindings,例如here

      2) 类名将是 public class Shooter extends JFrame {

      3) Swing 的绘制方法是public void paintComponent(Graphics g){

      4) 主要方法是

         public static void main(String[] args) {
              EventQueue.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      new Shooter();
                  }
              });
          }
      

      编辑:

      5) @camickr 正确注意到我 -> CustomPainting 应该在 JComponent 或 JPanel 上完成,或者您可以使用方法 paint 到 GlassPane or RootPane

      【讨论】:

      • +1,建议使用键绑定,但是在 Jframe 上覆盖 paintComponent() 将不起作用,因为该方法未在 JFrame 上实现。自定义绘画应该在 JComponent 或 JPanel 上完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多