写java程序我们经常完整的导入类库,而不愿单独的导入一个类。比如我们经常这样写:
import java.awt.*;
这样awt目录所有的类都可能被加载,比一个一个类进行导入要方便。
比如要导入:
import java.awt.Font;
import java.awt.Color;
就可以直接写成:import java.awt.*;
但是这样做存在“类重复定义的隐患”,如java.util.Timer与javax.swing.Timer都有Timer类,以下是一个弹跳球程序:
package bb;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PinBall{
private final int TABLE_WIDTH=300;
private final int TABLE_HEIGHT=400;
private final int RACKET_Y=340;
private final int RACKET_HEIGHT=20;
private final int RACKET_WIDTH=60;
private final int BALL_SIZE=16;
private Frame f=new Frame("弹球游戏");
Random rand=new Random();
private int ySpeed=10;
private double xyRate=rand.nextDouble()-0.5;
private int xSpeed=(int)(ySpeed*xyRate*2);
private int ballX=rand.nextInt(200)+20;
private int ballY=rand.nextInt(10)+20;
private int racketX=rand.nextInt(200);
private MyCanvas tableArea=new MyCanvas();
private String shape="";
Timer timer;
private boolean isLose=false;
public void init()
{
tableArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
f.add(tableArea);
KeyAdapter keyProcessor=new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
if(racketX>0)
racketX-=10;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
if(racketX<TABLE_WIDTH-RACKET_WIDTH)
racketX+=10;
}
}
};
f.addKeyListener(keyProcessor);
tableArea.addKeyListener(keyProcessor);
ActionListener taskPerformer=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(ballX<=0||ballX>=TABLE_WIDTH-BALL_SIZE)
xSpeed=-xSpeed;
if(ballY>=RACKET_Y-BALL_SIZE&&
(ballX<racketX||ballX>racketX+RACKET_WIDTH))
{
timer.stop();
isLose=true;
tableArea.repaint();
}
else if(ballY<=0||
(ballY>=RACKET_Y-BALL_SIZE&&ballX>racketX&&ballX<=racketX+RACKET_WIDTH))
{
ySpeed=-ySpeed;
}
ballY+=ySpeed;
ballX+=xSpeed;
tableArea.repaint();
}
};
timer = new Timer(100, taskPerformer);
timer.start();
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new PinBall().init();
}
class MyCanvas extends Canvas
{
public void paint(Graphics g)
{
if(isLose)
{
g.setColor(new Color(255,0,0));
g.setFont(new Font("Times",Font.BOLD,30));
g.drawString("游戏已结束!", 50, 200);
}
else
{
g.setColor(new Color(240,240,80));
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
g.setColor(new Color(80,80,200));
g.fillRect(racketX, RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);
}
}
}
}
程序出错,提示信息为:
The type Timer is ambiguous
其实上面的Timer类来自javax.swing.Timer,但由于java.util.Timer也有Timer类,出现了模棱两可的情况。而程序中只用了java.util.Random类,所以不能完全导入java.util.*,而应该单独导入java.util.Random,正确代码如下:
package bb;
import java.util.Random;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PinBall{
private final int TABLE_WIDTH=300;
private final int TABLE_HEIGHT=400;
private final int RACKET_Y=340;
private final int RACKET_HEIGHT=20;
private final int RACKET_WIDTH=60;
private final int BALL_SIZE=16;
private Frame f=new Frame("弹球游戏");
Random rand=new Random();
private int ySpeed=10;
private double xyRate=rand.nextDouble()-0.5;
private int xSpeed=(int)(ySpeed*xyRate*2);
private int ballX=rand.nextInt(200)+20;
private int ballY=rand.nextInt(10)+20;
private int racketX=rand.nextInt(200);
private MyCanvas tableArea=new MyCanvas();
private String shape="";
Timer timer;
private boolean isLose=false;
public void init()
{
tableArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
f.add(tableArea);
KeyAdapter keyProcessor=new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
if(racketX>0)
racketX-=10;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
if(racketX<TABLE_WIDTH-RACKET_WIDTH)
racketX+=10;
}
}
};
f.addKeyListener(keyProcessor);
tableArea.addKeyListener(keyProcessor);
ActionListener taskPerformer=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(ballX<=0||ballX>=TABLE_WIDTH-BALL_SIZE)
xSpeed=-xSpeed;
if(ballY>=RACKET_Y-BALL_SIZE&&
(ballX<racketX||ballX>racketX+RACKET_WIDTH))
{
timer.stop();
isLose=true;
tableArea.repaint();
}
else if(ballY<=0||
(ballY>=RACKET_Y-BALL_SIZE&&ballX>racketX&&ballX<=racketX+RACKET_WIDTH))
{
ySpeed=-ySpeed;
}
ballY+=ySpeed;
ballX+=xSpeed;
tableArea.repaint();
}
};
timer = new Timer(100, taskPerformer);
timer.start();
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new PinBall().init();
}
class MyCanvas extends Canvas
{
public void paint(Graphics g)
{
if(isLose)
{
g.setColor(new Color(255,0,0));
g.setFont(new Font("Times",Font.BOLD,30));
g.drawString("游戏已结束!", 50, 200);
}
else
{
g.setColor(new Color(240,240,80));
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
g.setColor(new Color(80,80,200));
g.fillRect(racketX, RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);
}
}
}
}