KeyLisenter,repaint(),方法

时间:2014-11-23 23:57:52

标签: java applet

好的,我在过去一小时或更长时间内一直在努力修补它。我想把玩家类和小程序分开,因为当我向玩家类添加更多内容时,它会更有条理。但是,因为我这样做了,我在错误后出错了,我有另一个类似于这个文件的文件,它在相同的文件中绘制applet,没有错误和运行。我一步一步地看着它仍然找不到它。所以我希望有人能解释为什么我会得到这三个错误。

player.java

package com.powder.game;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class player implements KeyListener{

private Rectangle rect;
public void init(){
    rect = new Rectangle(10, 10, 50, 50); // make the rectangle

    this.addKeyListener(this); // Listens to see if Rectangle is pressed
}

    public void paint(Graphics e){
    super.paint(e);

    Graphics2D g2 = (Graphics2D) e;

    g2.setColor(Color.RED); // Sets a color for the rectangle
    g2.fill(rect);
}

public void keyTyped(KeyEvent e){

}

@Override
public void keyPressed(KeyEvent e){

    if(e.getKeyCode() == KeyEvent.VK_E){
        rect.setLocation(rect.x, rect.y-10);
    }

    if(e.getKeyCode() == KeyEvent.VK_S){
        rect.setLocation(rect.x-10, rect.y);
    }

    if(e.getKeyCode() == KeyEvent.VK_D){
        rect.setLocation(rect.x, rect.y+10);
    }

    if(e.getKeyCode() == KeyEvent.VK_F){
        rect.setLocation(rect.x+10, rect.y);
    }
    repaint();
}

public void KeyReleased(KeyEvent e){

}
}

MyFrameInit.java

package com.powder.game;

import javax.swing.*;

import java.applet.*;
import java.awt.*;
import java.util.*;
import java.io.IOException;
import java.lang.Math;

import javax.swing.ImageIcon;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import com.powder.game.player;

public class MyFrameInit extends Applet {

player p = new player();

public void paint(Graphics g){
    super.paint(g); // Super calls the parent
    g.setColor(Color.BLUE); // Setting color for g (background)
    g.fillRect(0, 0, 600, 400); // fill the background blue at x,y,width,height
    this.setSize(600, 400);  // Set the size of the applet
    p.init();
}
}

很抱歉,如果页面格式不正确。仍在努力理解这一点。我已经习惯了标签lol。

编辑:所以,我将Applet扩展到了播放器,它几乎修复了我刚添加的所有内容

public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

到最后它开始起作用了。现在我唯一的问题是,当我在player.java中转到init()之后,它不会保留MyFrameInit.java我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题

Player没有方法......

  • addKeyListener
  • repaint

它不会从任何东西继承,因此它无法调用...

  • super.paint,因为它的父类没有这种方法......

你不能打电话给你没有......

Player不符合KeyListener界面的合同要求,但未实现

  • public void keyReleased(KeyEvent e)

绘画用于绘制组件的当前状态,您不应该在任何绘制方法中修改组件或任何子组件的状态,因为这会产生无限重绘的循环

不要这样做:

  • this.setSize(600, 400); // Set the size of the applet - 您永远不应该尝试设置小程序的大小,大小由HTML标记确定
  • p.init();。您的paint方法将在程序的生命周期中被调用很多次,初始化对象需要在调用之间保持状态
  • 是没有意义的。

建议

  • 首先使用JApplet代替Applet
  • Player扩展您的JPanel;覆盖它的paintComponent方法而不是它的paint方法(而不是调用super.paintComponent);覆盖它的getPreferredSize方法并为组件返回合理的默认大小
  • add PlayerJApplet ...
  • 使用密钥绑定API代替KeyListener,请参阅How to Use Key Bindings。这将为你节省几天的头痛和挫折感。