㈠ 2.java有哪幾種常見的實現動畫的方法
一: 用多線程播放一組圖片, 實現動畫片的效果; 類似於逐幀動畫,每個圖片是動畫的一幀
二: 在awt/swing界面里, 可以使用paint方法,去繪制圖形,然後用swing提供的Timer或者多線程技術,去刷新繪制的圖形
三:在JavaFX里, 本身就支持動畫,並且封裝了很多動畫效果可以直接使用,比如逐幀動畫.縮放動畫,漸變動畫,旋轉動畫,位置動畫等.
強烈推薦使用javaFX來實現動畫, 因為javaFX是現代化的圖形界面工具,具有簡單,強大,組件豐富,跨平台,支持Html5, 支持表格, 支持動畫等多種優勢
下面是一個javaFX繪制的動態表格
javaFX動態表格
㈡ 請教用java製作動畫的教程
//才幾分啊,還有那麼多要求?不幹了!
//RobotTest.java
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;
public class RobotTest extends JPanel implements Runnable{
JLabel head,neck,body;
boolean sw;
RobotTest(){
super(null);
head=new JLabel("HEAD"){
protected void paintBorder(Graphics g) {
g.setColor(Color.black);
g.drawOval(0, 0, getSize().width-1,
getSize().height-1);
}
};
neck=new JLabel("<html>N<br>E<br>C<br>K");
body=new JLabel("BODY");
head.setHorizontalAlignment(JLabel.CENTER);
neck.setHorizontalAlignment(JLabel.CENTER);
body.setHorizontalAlignment(JLabel.CENTER);
head.setSize(60,60);
neck.setSize(20,20);
body.setSize(100,128);
neck.setBorder(BorderFactory.createLineBorder(Color.black));
body.setBorder(neck.getBorder());
body.setLocation(0,158);
neck.setLocation(40,0);
head.setLocation(20,0);
add(head);
add(neck);
add(body);
}
public void run(){
int i=0;
while(i<1000){
setLocation(i+=5,0);
neck.setSize(20,(sw=!sw)?60:80);
neck.setLocation(neck.getX(),body.getY()-neck.getHeight());
head.setLocation(head.getX(),neck.getY()-head.getHeight());
try {
Thread.sleep(333);
} catch (Exception e) {}
}
}
public static void main(String[] args) {
RobotTest rt = new RobotTest();
rt.setSize(100,300);
new Thread(rt).start();
JFrame f= new JFrame();
f.getContentPane().setLayout(null);
f.getContentPane().add(rt);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600,330);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
㈢ JAVA動畫
用Java畫動畫很簡單,讓一個線程自己定時調用自己即可,記得要設置一個退出(結束)條件。
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Animation {
final static int DELAY = 500;
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Text text = new Text(shell, SWT.BORDER);
text.setText("0");
new Runnable() {
public void run() {
if (shell.isDisposed())
return;
text.setText("" + (Integer.parseInt(text.getText()) + 1));
Display.getDefault().timerExec(DELAY, this);
}
}.run();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
㈣ 用JAVA做個小動畫
在你的代碼上修改了一下,運行試試吧
importjava.awt.Graphics;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassFextendsJFrame{
publicF(){
panp=newpan();
this.add(p);
}
publicstaticvoidmain(String[]args){
Ffl=newF();
fl.setSize(400,400);
fl.setVisible(true);
fl.run();
fl.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
intx,y;
publicvoidrun(){
intr=100;
intangle=0;
while(true){
x=(int)((Math.cos(angle*2)*Math.PI)*r);
y=(int)((Math.sin(angle*2)*Math.PI)*r);
angle++;
repaint();
}
}
classpanextendsJPanel{
publicvoidpaint(Graphicsg){
g.drawLine(200,200,200,250);
g.drawLine(200,225,x,y);
g.drawLine(200,225,x,y);
g.drawLine(200,250,180,300);
g.drawLine(200,250,220,300);
g.drawOval(175,150,50,50);
}
}
}
㈤ 如何優化java動畫編程中的顯示效果
Java動畫編程有多種實現方法,但它們實現的基本原理是一樣的,即在屏幕上畫出一系列的幀來造成運動的感覺。Java多線程技術是Java動畫編程中普遍運用的技術,它在控制動畫程序的流程和動畫的顯示效果方面起著重要的作用。Java動畫編程中的動畫閃爍和圖像殘缺不全等現象,是Java程序員經常遇到的問題。本文以作者應用實常式序為基礎,闡述如何運用多線程、重載Update、雙緩沖和圖像跟蹤等技巧來解決這類問題,以達到動畫顯示的最佳效果。
Java多線程技術
Java多線程技術簡介
目前,線程(Thread)已經為許多操作系統和應用開發系統所採用。線程是程序的單個控制流,具有順序程序的特點。但是,線程不是一個程序,它僅僅是程序的一個執行序列。線程具有很強的並發功能,在同一時刻可以有多個線程同時處於執行狀態。線程是動態的,具有一定的生命周期,分別經歷從創建、執行、阻塞、直到消亡的過程。Java語言對多線程編程的支持有兩種實現方法:一種是直接繼承Thread類,另一種是實現Runnable介面。Thread類提供了對線程的控制方法,如start(),stop(),run()、suspend()、resume()和sleep()等方法,它們可以對線程的狀態進行控制。
動畫線程的設計與實現
為了每秒中多次更新屏幕,必須創建一個線程來實現動畫的循環,這個循環要跟蹤當前幀並響應周期性的屏幕更新要求。許多Java初學者容易犯的一個錯誤是將動畫循環放在paint()中,這樣占據了主AWT線程,而主線程將負責所有的繪圖和事件處理。因此,應該生成一個獨立的動畫線程來完成圖像的顯示和更新。例如,在一個Applet框架下,當Applet啟動(Start)時,生成一個動畫線程;在Applet停止(stop)時,終止該動畫線程以釋放它所佔用的CPU資源。下列程序代碼(簡稱「C1」代碼)是該動畫線程的具體實現:
public void start() {
if(animatorThread==null) {
animatorThread=new Thread(this);
//開始動畫線程
animatorThread.start();
}
}
public void stop(){
//停止動畫線程
animatorThread=null;
}
上面終止動畫線程的時候,並不是調用該動畫線程的stop()方法,而是設置該動畫線程為null。因為如果直接調用線程的stop()方法會強制線程終止所有的執行工作,有時會帶來不好的結果。設置該動畫線程為null,則在run()方法中,由於不滿足循環條件,線程會自然退出。這樣,也進一步優化了該動畫程序。
重載update()和雙緩沖技術消除閃爍
在Java中,動畫發生閃爍有兩個原因:一個是由於在顯示下一幀畫面的時候,調用了repaint()方法;而repaint()方法被調用時,要清除整個背景,然後才調用paint()方法顯示畫面。這樣,在清除背景和繪制圖像的短暫時間間隔內被用戶看見的就是閃爍。另一個是由於paint()方法要進行復雜的計算,繪制每一幀花費的時間太長,圖像中的各個像素值不能同時得到,使得動畫的生成頻率低於顯示器的刷新頻率,從而造成閃爍。
下面兩種方法可以明顯地消除或減弱閃爍。
重載update()方法
當AWT接收到一個Applet的重繪請求時,它就調用Applet的update()方法。預設情況下,update()方法清除Applet的背景,然後調用paint()方法。重載update()方法就可以將以前在paint()方法中的繪圖代碼包含在update()方法中,從而避免每次重繪時將整個區域清除。既然背景不再自動清除,Java程序員需要自己在update()中完成。
雙緩沖技術
另一種消除幀之間閃爍的方法是使用雙緩沖技術,它在許多動畫Applet中被使用。主要原理是創建一幅後台圖像,將每一幀畫入圖像,然後調用drawImage()方法將整個後台圖像一次畫到屏幕上去。這種方法的優點在於大部分繪制是離屏的。將離屏圖像一次繪至屏幕上,比直接在屏幕上繪制要有效得多。在創建後台圖像前,首先要通過調用createImage()方法生成合適的後台緩沖區,然後獲得在緩沖區做圖的環境(即Graphics類對象)。
下列實常式序代碼(簡稱「C2」代碼)就是這兩種方法的結合使用,雙緩沖技術在重載update()方法中實現。其中,offImage是Image類的對象,offGraphics是Graphics類的對象,這兩個類對象是實現雙緩沖技術的關鍵。相關代碼如下:
public void paint(Graphics g){
update(g);
}
public void update(Graphics g){
Dimension d=getSize();
//如果後台圖像不存在,就創建一個後台圖像
if((offGraphics==null)||(d.width!=offDimension.width)
||(d.height!=offDimension.height)) {
offDimension=d;
offImage=createImage(d.width,d.height);
offGraphics=offImage.getGraphics();
}
//擦除上一幀
offGraphics.setColor(getBackground());
offGraphics.fillRect(0,0,d.width,d.height);
offGraphics.setColor(Color.black);
//將當前的幀輸出到指定的image中
for(int i=0 ; i<10 ; i++){
offGraphics.drawImage(images[i],frameNumber*5%(d.width/2)
,i*d.height/10,this);
}
//輸出指定的後台圖像
g.drawImage(offImage,frameNumber*5%(d.width/2),0,this);
}
雙緩沖技術可以使動畫平滑,但有一個缺點,要分配一個後台圖像的緩沖,如果圖像相當大,這將佔用很大一塊內存。
圖像跟蹤與程序的逐步完善
圖像跟蹤
當動畫線程剛剛啟動的時候,由於沒有全部載入圖像,屏幕上顯示的畫面經常是殘缺不全的。這時可以使用MediaTracker或ImageOberver類對象進行圖像跟蹤,待圖像全部載入後,再調用drawImage()方法將圖像輸出到屏幕上去。DrawImage()方法的第四個參數正是ImageObserver類對象,所以可以用ImageObserver類對象進行圖像跟蹤。在實際應用Applet程序的init()方法中實現圖像跟蹤,相當於在動畫線程的DrawImage()方法調用以前就畫了一次圖像,因為動畫線程的初始化過程,即init()方法是先被調用的。下列代碼(簡稱「C3」代碼)展示了init()方法使用MediaTracker類對象來實現跟蹤圖像的載入,代碼如下:
public void init(){
tracker=new MidiaTracker(this);
for(int i=1;i<=10;i++){
image[i-1]=getImage(getCodeBase(),"image"+i+".gif");
//用MediaTracker類對象的addImage()方法跟蹤圖像的載入
tracker.addImage(images[i-1],0);
}
......
}
程序的進一步完善
在「C2」代碼的重載update()方法中加入下列if語句,從而對MediaTracker類對象的圖像跟蹤方法做出判斷,if語句如下:
if(!tracker.checkAll()){
//如果圖像還沒有裝載完畢,則僅清除背景,同時輸出一個狀態
g.clearRect(0,0,d.width,d.height);
g.drawString("Please wait...",0,d.height/2);
return;
}
在「C1」代碼的stop()方法中加入兩行代碼,用以釋放由雙緩沖技術所佔用的內存資源,這時stop()方法改為:
public void stop(){
//停止動畫線程
animatorThread=null;
//釋放用於雙緩沖的內存資源
offGraphics=null;
offImage=null;
}
程序修改到此,還有一個小問題,就是動畫線程啟動後,第一幅圖像有時仍有殘留痕跡,而不是隨著圖像的更新而完全擦除掉。如果想解決此問題,只要將「C2」代碼中最後的for()循環和g.drawImage()方法改為如下代碼就可以了。
for(int i=0;i<10;i++){
offGraphics.drawImage(images[frameNumber%10],
,frameNumber*5%(d.width),i*d.height/10,this);
}
g.drawImage(offImage,0,0,this);
保持恆定的幀速度
為了使用戶觀看動畫時沒有閃爍感,至少需要達到每秒12幀的速度。更高的幀速度會產生更平滑的動畫。通常,在動畫顯示的每兩幀之間,調用線程的sleep()方法休眠一個固定的
㈥ 求java做動畫代碼
importjava.awt.Canvas;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.RenderingHints;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
{
=1L;
privatestaticbooleanPRESSED=false;
privatestaticintpointX=0;
privatestaticintpointy=200;
privatestaticintRIGHT_GO=0;
privatestaticintLEFT_GO=0;
privatestaticintDIR=0;
privatestaticintANGLE=0;
privatestaticintW=50;
privatestaticintH=60;
private_Canvascanvas=null;
publicTestImage()
{
add(canvas=new_Canvas());
setIgnoreRepaint(true);
requestFocus();
}
publicclass_
{
=1L;
privateBufferedImagebi=null;
privateImagebufferedImage=null;
privateThreadthread=null;
privatelongsleepTime=10;
public_Canvas()
{
try
{
bi=ImageIO.read(newFile("go.png"));
}
catch(IOExceptione)
{}
setBackground(Color.BLACK);
requestFocus();
addKeyListener(newKeyListener()
{
@Override
publicvoidkeyTyped(KeyEvente)
{}
@Override
publicvoidkeyReleased(KeyEvente)
{
RIGHT_GO=0;
PRESSED=false;
}
@Override
publicvoidkeyPressed(KeyEvente)
{
//38403739上下左右
DIR=e.getKeyCode();
PRESSED=true;
}
});
}
@Override
publicvoidpaint(Graphicsg)
{
Graphics2Dg2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(rotateImage(bi.getSubimage(RIGHT_GO,LEFT_GO,W,H),ANGLE,true),pointX,pointy,W,H,
this);
g2d.dispose();
}
@Override
publicvoipdate(Graphicsg)
{
if(null==bufferedImage)
{
bufferedImage=createImage(getWidth(),getHeight());
}
GraphicsbufferedG=bufferedImage.getGraphics();
bufferedG.clearRect(0,0,getWidth(),getHeight());
paint(bufferedG);
bufferedG.dispose();
g.drawImage(bufferedImage,0,0,this);
g.dispose();
}
publicvoidstart()
{
thread=newThread(this);
thread.setName("TestImage");
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
publicsynchronizedvoidstop()
{
thread=null;
notify();
}
@Override
publicvoidrun()
{
Threadme=Thread.currentThread();
while(thread==me&&!isShowing()||getSize().width==0)
{
try
{
Thread.sleep(555);
}
catch(InterruptedExceptione)
{
return;
}
}
while(thread==me&&isShowing())
{
if(PRESSED)
{
try
{
if(DIR==39)
{
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=0;
pointX=pointX+1;
if(pointX>420)
{
ANGLE=90;
pointX--;
pointy--;
W=60;
H=50;
}
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
}
elseif(DIR==37)
{
pointX=pointX-1;
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=60;
if(pointX<0)
{
ANGLE=-90;
pointX++;
pointy--;
W=60;
H=50;
}
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
}
elseif(DIR==38)
{
W=50;
H=60;
pointy=150;
ANGLE=0;
RIGHT_GO=100;
}
elseif(DIR==40)
{
W=50;
H=60;
ANGLE=0;
pointy=200;
RIGHT_GO=0;
}
Thread.sleep(sleepTime);
repaint();
}
catch(InterruptedExceptione)
{
break;
}
}
else
{
RIGHT_GO=RIGHT_GO+50;
LEFT_GO=0;
pointX=pointX+1;
if(RIGHT_GO>50)
{
RIGHT_GO=0;
}
if(pointX>500)
{
pointX=0;
}
try
{
Thread.sleep(sleepTime);
repaint();
}
catch(InterruptedExceptione)
{
break;
}
}
}
thread=null;
}
}
/**
*旋轉圖像為指定角度
*
*@paramdegree
*@return
*/
(finalBufferedImageimage,finalintangdeg,finalbooleand)
{
intw=image.getWidth();
inth=image.getHeight();
inttype=image.getColorModel().getTransparency();
BufferedImageimg;
Graphics2Dgraphics2d;
(graphics2d=(img=newBufferedImage(w,h,type)).createGraphics()).setRenderingHint(
RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate(d?-Math.toRadians(angdeg):Math.toRadians(angdeg),w/2,h/2);
graphics2d.drawImage(image,0,0,null);
graphics2d.dispose();
returnimg;
}
publicstaticvoidmain(String[]args)
{
EventQueue.invokeLater(newRunnable()
{
@Override
publicvoidrun()
{
finalTestImageti=newTestImage();
ti.setSize(newDimension(500,300));
ti.setLocationRelativeTo(null);
ti.addWindowListener(newWindowAdapter()
{
@Override
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
@Override
publicvoidwindowDeiconified(WindowEvente)
{
ti.canvas.start();
}
@Override
publicvoidwindowIconified(WindowEvente)
{
ti.canvas.stop();
}
});
ti.setResizable(false);
ti.canvas.start();
ti.setVisible(true);
}
});
}
}
㈦ java中簡單動畫的製作要用些什麼函數,是否有的是用一些繪圖函數自己指定繪出來的嗎有的話又是哪些
<script Language="javascript">
/****************** JS2D函數集 *******************
作者:neweroica 2003-3-28
CopyRight (C) 2003
在引用或轉載時請保留此版權信息,謝謝!!!
本函數集可以單獨存成一個js文件:"JS2D.js"
***************************************************/
/************* 畫點 **************
x,y 點所在的屏幕坐標(像素)
color 顏色(字元串值)
size 大小(像素)
**********************************/
function drawDot(x,y,color,size){
document.write("<table border='0' cellspacing=0 cellpadding=0><tr><td style='position: absolute; left: "+(x)+"; top: "+(y)+";background-color: "+color+"' width="+size+" height="+size+"></td></tr></table>")
}
/************* 畫直線 **************
x1,y1 起點所在的屏幕坐標(像素)
x2,y2 終點所在的屏幕坐標(像素)
color 顏色(字元串值)
size 大小(像素)
style 樣式
=0 實線
=1 虛線
=2 虛實線
**********************************/
function drawLine(x1,y1,x2,y2,color,size,style){
var i;
var r=Math.floor(Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
var theta=Math.atan((x2-x1)/(y2-y1));
if(((y2-y1)<0&&(x2-x1)>0)||((y2-y1)<0&&(x2-x1)<0))
theta=Math.PI+theta;
var dx=Math.sin(theta);//alert(dx)
var dy=Math.cos(theta);
for(i=0;i<r;i++){
switch(style){
case 0:
drawDot(x1+i*dx,y1+i*dy,color,size);
break;
case 1:
i+=size*2;
drawDot(x1+i*dx,y1+i*dy,color,size);
break;
case 2:
if(Math.floor(i/4/size)%2==0){
drawDot(x1+i*dx,y1+i*dy,color,size);
}
else{
i+=size*2;
drawDot(x1+i*dx,y1+i*dy,color,size);
}
break;
default:
drawDot(x1+i*dx,y1+i*dy,color,size);
break;
}
}
}
/************* 畫實心矩形 **************
x1,y1 起點(矩形左上角)所在的屏幕坐標(像素)
x2,y2 終點(矩形右下角)所在的屏幕坐標(像素)
color 顏色(字元串值)
**********************************/
function drawFilledRect(x1,y1,x2,y2,color){
document.write("<table border='0' cellspacing=0 cellpadding=0><tr><td style='position: absolute; left: "+(x1)+"; top: "+(y1)+";background-color: "+color+"' width="+(x2-x1)+" height="+(y2-y1)+"></td></tr></table>")
}
/************* 畫矩形 **************
x1,y1 起點(矩形左上角)所在的屏幕坐標(像素)
x2,y2 終點(矩形右下角)所在的屏幕坐標(像素)
color 顏色(字元串值)
size 大小(像素)
style 樣式
=0 實線
=1 虛線
=2 虛實線
**********************************/
function drawRect(x1,y1,x2,y2,color,size,style){
drawLine(x1,y1,x2,y1,color,size,style);
drawLine(x1,y2,x2,y2,color,size,style);
drawLine(x1,y1,x1,y2,color,size,style);
drawLine(x2,y1,x2,y2,color,size,style);
}
/************* 畫橢圓 **************
x,y 中心所在的屏幕坐標(像素)
a,b 長軸和短軸的長度(像素)
color 顏色(字元串值)
size 大小(像素)
precision 邊緣精細度
**********************************/
function drawOval(x,y,a,b,color,size,precision){
var i;
var iMax=2*Math.PI;
var step=2*Math.PI/(precision*Math.sqrt(a*b)*4.5);
for(i=0;i<iMax;i+=step){
drawDot(x+a*Math.cos(i),y+b*Math.sin(i),color,size);
}
}
/************* 畫多邊形 **************
x,y 中心所在的屏幕坐標(像素)
r 多邊形外接圓半徑(像素)
n 多邊形的邊數
color 顏色(字元串值)
size 大小(像素)
style 樣式
=0 實線
=1 虛線
=2 虛實線
**********************************/
function drawPoly(x,y,r,n,color,size,style){
var i;
var theta=Math.PI;
var x1=x,y1=y-r,x2,y2;
for(i=0;i<n;i++){
theta-=(2*Math.PI/n);
x2=x+r*Math.sin(theta);
y2=y+r*Math.cos(theta);
drawLine(x1,y1,x2,y2,color,size,style);
x1=x2;
y1=y2;//alert(x1+" "+y1)
}
}
</script>
<script>
//****************** JS2D函數集示例 *******************
drawLine(20,20,300,20,"#0000cc",2,0);
drawLine(20,40,300,40,"#0000cc",2,1);
drawLine(20,60,300,60,"#0000cc",2,2);
drawFilledRect(20,80,300,200,"009900");
drawRect(20,220,220,320,"ff0000",2,0);
drawRect(240,220,440,320,"ff0000",2,1);
drawRect(460,220,660,320,"ff0000",2,2);
drawOval(250,450,120,50,"006600",1,1);
drawOval(250,650,120,120,"006600",2,0.5);
drawPoly(200,900,100,3,"ff8800",2,0);
drawPoly(400,900,100,4,"ff8800",2,1);
drawPoly(600,900,100,5,"ff8800",2,2);
drawPoly(200,1100,100,6,"ff8800",2,0);
drawPoly(400,1100,100,7,"ff8800",2,1);
drawPoly(600,1100,100,12,"ff8800",2,2);
</script>
㈧ 怎麼用java做動畫
重寫paint方法,來實現將自己定義的圖片繪制到組件中,然後啟動一個線程來控制paint方法。 示例: ××××××××××××××××××××××××××× import javax.swing.*; import java.awt.*; class MyPanel extends JPanel implements Runnable { private Image img; private int i=0; private int j=0; public MyPanel() { img=new ImageIcon("1.png").getImage(); } public void paint(Graphics g) { g.drawImage(img,0,0,60,104,i*60,j*104,i*60+60,j*104+104,this); } public void run() { while(true) { while(j { while(i { try { Thread.sleep(300); } catch(Exception e) { } this.repaint(); i++; } j++; i=0; } i=0; j=0; } } } public class test extends JFrame { private MyPanel p; public test() { p=new MyPanel(); this.add(p,BorderLayout.CENTER); this.setBounds(300,200,300,300); this.setTitle("人物行走圖"); new Thread(p).start(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) { new test(); } } ××××××××××××××××××××××× 將以上源碼保存為:test.java,編譯,然後下載下面的圖片 將下載的圖片改名為1.png" target="_blank" >㈨ java做動畫的原理,加個實例,謝謝
我用swing 做了個 雷霆戰機的。。 g.fillRect(x60, y60, 10, 10);
g.fillRect(x70, y70, 10, 10); 畫子彈的
g.drawImage(new ImageIcon("src/fr.jpg").getImage(),x0,y0,7,7,rootPane); 畫飛機的
g.drawImage(new ImageIcon("src/fr.jpg").getImage(),x02,y02,7,7,rootPane);
g.drawImage(new ImageIcon("src/fr.jpg").getImage(),x03,y03,7,7,rootPane);
用多線程 然後不停刷新 (g 是 Graphics g x60, y60 這些都是坐標 後面的是長寬 )
當時import的包
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Date;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;