public class GamePanel extends JPanel
{
MainFrame mainFrame;
private Image background = ImageUtil.getImage("images/background.jpg");
public GamePanel(MainFrame mainFrame) {
this.mainFrame = mainFrame;
// this.setPreferredSize(new Dimension())
}
public void paint(Graphics g) {
g.drawImage(this.background, 0, 0, this.getWidth(),
this.getHeight() , null);
Piece currentPiece = this.mainFrame.getCurrentPiece();
ImageUtil.paintPiece(g, currentPiece);
Square[][] squares = this.mainFrame.getSquares();
if (squares == null) return;
for (int i = 0; i < squares.length; i++) {
for (int j = 0; j < squares[i].length; j++) {
Square s = squares[i][j];
if (s != null) {
g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(), this);
}
}
}
}}
这里是一个实现俄罗斯方块背景类,Graphics g 这是一个抽象对象,程序里g还调用了抽象方法g.drawImage,可是我知道抽象方法是没有实际功能的,我把这句注释掉,背景的显示就会出现白版,这就和“抽象方法是没有实际功能”发生矛盾了。这是什么原因呢?
abstract void speak();
}class Men extends Person{
//子类必须实现父类的抽象方法
void speak() {
System.out.println("i'm a men");
}
}class Women extends Person{
//子类必须实现父类的抽象方法
void speak() {
System.out.println("i'm a women");
}
}class Test{
public void doSometing(Person p){
p.speak();
}
public static void main(String[] args) {
Test t = new Test();
t.doSometing(new Men());
}
}
这个方法是系统调用的,此时系统获取的g不是抽象的,而是Graphcis的非抽象子类的对象
同样的,自己调用时
paint(this.getGraphics()); //这里getGraphics()返回的也是非抽象子类的对象
LZ想知道具体是什么对象,可以在paint方法中打印一下就知道了 public void paint(Graphics g) {
System.out.println(g); //or System.out.println(g.getClass()) 调用这个查看具体是什么子类
g.drawImage(this.background, 0, 0, this.getWidth(),
this.getHeight() , null);
Piece currentPiece = this.mainFrame.getCurrentPiece();
ImageUtil.paintPiece(g, currentPiece);
Square[][] squares = this.mainFrame.getSquares();
if (squares == null) return;
for (int i = 0; i < squares.length; i++) {
for (int j = 0; j < squares[i].length; j++) {
Square s = squares[i][j];
if (s != null) {
g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(), this);
}
}
}
}