2013-04-03 51 views
0

我所試圖做的僅僅是擲骰子,並有滾動骰子動畫(只需顯示隨機骰子值,而滾動)我怎樣做一個JPanel中一個簡單的圖形動畫

到目前爲止我的代碼爲模具:

import java.awt.*; 

import javax.swing.*; 

public class diePanel extends JPanel{ 

private int dieValue; 
private boolean onHold=false; 
private int pNum; 

public diePanel(){ 
    super(); 
} 

public void setPlayerNumber(int pNum){ 
    this.pNum=pNum; 
} 

public void setDieValue(int dieValue){ 
    this.dieValue=dieValue; 
} 

public int checkDieValue(){ 
    return dieValue; 
} 

public void roll(){ 
    dieValue=(int) ((Math.random()*6)+1); 
    repaint(); 
} 

public void changeOnHold(){ 
    onHold=!onHold; 
} 

public void unHold(){ 
    onHold=false; 
} 

public boolean checkOnHold(){ 
    return onHold; 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    this.setSize(50,50); 
    this.setVisible(true); 
    if(pNum==1){ 
     if(dieValue==1){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==2){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
     } 
     else if(dieValue==3){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(23,23,5,5); 

     } 
     else if(dieValue==4){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
     } 
     else if(dieValue==5){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==6){ 
      if(onHold==false){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.black); 
      } 
      else{ 
       g.setColor(Color.white); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(7,23,5,5); 
      g.fillOval(38,23,5,5); 
     } 
    } 
    if(pNum==2){ 
     if(dieValue==1){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==2){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
     } 
     else if(dieValue==3){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(23,23,5,5); 

     } 
     else if(dieValue==4){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
     } 
     else if(dieValue==5){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==6){ 
      if(onHold==false){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.blue); 
      } 
      else{ 
       g.setColor(Color.green); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(7,23,5,5); 
      g.fillOval(38,23,5,5); 
     } 
    } 
    if(pNum==3){ 
     if(dieValue==1){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==2){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
     } 
     else if(dieValue==3){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(23,23,5,5); 

     } 
     else if(dieValue==4){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
     } 
     else if(dieValue==5){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==6){ 
      if(onHold==false){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.pink); 
      } 
      else{ 
       g.setColor(Color.orange); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(7,23,5,5); 
      g.fillOval(38,23,5,5); 
     } 
    } 
    if(pNum==4){ 
     if(dieValue==1){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==2){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
     } 
     else if(dieValue==3){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(23,23,5,5); 

     } 
     else if(dieValue==4){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
     } 
     else if(dieValue==5){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(23,23,5,5); 
     } 
     else if(dieValue==6){ 
      if(onHold==false){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillRoundRect(0, 0, 50, 50, 10, 10); 
      if(onHold==true){ 
       g.setColor(Color.red); 
      } 
      else{ 
       g.setColor(Color.gray); 
      } 
      g.fillOval(7,7,5,5); 
      g.fillOval(38,38,5,5); 
      g.fillOval(7,38,5,5); 
      g.fillOval(38,7,5,5); 
      g.fillOval(7,23,5,5); 
      g.fillOval(38,23,5,5); 
     } 
    } 
    } 
} 

如果我在幀呼籲卷:

for(int i=0;i<numDice;i++){ 
    die[i].setPlayerNumber(cPlayer+1); 
    if(die[i].checkOnHold()==false){ 
     for(int i2=0;i2<100;i2++){ 
      die[i].roll(); 
      try { 
        Thread.sleep(5); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated  catch block 
       e.printStackTrace(); 
      } 
      repaint(); 
     } 
    } 
} 

使用重繪()僅僅是導致按下按鈕被推遲

任何幫助,將不勝感激

謝謝

回答

2

你基本上違反搖擺的單線程規則。特別是,您正在執行Event Dispatching Thread中的長時間運行和阻塞操作,阻止它處理重新繪製請求,因此沒有任何工作原因。

您可以使用Swing Timer來解決問題,但更有可能的是,SwingWorker會產生更理想的結果。

看看Concurrency in swing更多細節

與例如

我通過您的代碼消失了,有一些事情,嚇唬我更新。

  • 你永遠不應該從paint方法中修改的UI,無論如何,這將導致重繪管理器來安排新的重繪,這將等等等等打電話給你paint方法...

這...

this.setSize(50,50); 
this.setVisible(true); 

是一個非常糟糕的主意。首先,你不應該依賴setSize,而是應該覆蓋getPreferredSize。這將允許您使用適當的佈局管理器來佈置您的組件。

  • 使用DiePanel中的「玩家」標誌來確定每個骰子應該塗在哪裏。

這是一個壞主意,原因很多。首先,你並沒有實際跟蹤每個玩家,所以只有玩家的死亡會被繪製,但每個玩家都會共享相同的擲骰。

你也在爲每個玩家重複相同的代碼,這是完全的浪費。

A DiePanel應該代表一個工作單元,它應該代表單個參與者的結果,或者多個面板可以用來根據需要產生累積結果。

  • 你不應該依賴「魔術」號碼。

您的油漆代碼依賴於一個事實,即組件是一個給定大小,這並不總是可能的,相反,你應該使用的組件widthheight值,以便更好地產生結果,或保持在一個模具靜態的大小,但更好地定位它,比如在組件中間。

以下示例更正了這些問題中較嚴重的問題,但它旨在演示如何使用SwingWorker來模擬模具卷。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DiceRoll { 

    public static void main(String[] args) { 
     new DiceRoll(); 
    } 

    public DiceRoll() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private DiePanel diePane; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      diePane = new DiePanel(); 
      diePane.roll(); 
      add(diePane); 
      JButton roll = new JButton("Roll"); 
      add(roll, BorderLayout.SOUTH); 
      roll.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        new DieRoller(diePane).execute(); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 
    } 

    public class DieRoller extends SwingWorker<Void, Integer> { 

     private DiePanel diePane; 

     public DieRoller(DiePanel diePane) { 
      this.diePane = diePane; 
     } 

     @Override 
     protected void process(List<Integer> chunks) { 
      diePane.roll(); 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      int rolls = ((int) Math.round(Math.random() * 100)) + 1; 
      System.out.println("Rolls = " + rolls); 
      for (int roll = 0; roll < rolls; roll++) { 
       publish(roll); 
       Thread.sleep(125); 
      } 
      return null; 
     } 
    } 

    public class DiePanel extends JPanel { 

     private int dieValue; 
     private boolean onHold = false; 

     public DiePanel() { 
      super(); 
     } 

     public void setDieValue(int dieValue) { 
      this.dieValue = dieValue; 
     } 

     public int checkDieValue() { 
      return dieValue; 
     } 

     public void roll() { 
      dieValue = (int) ((Math.random() * 6) + 1); 
      repaint(); 
     } 

     public void changeOnHold() { 
      onHold = !onHold; 
     } 

     public void unHold() { 
      onHold = false; 
     } 

     public boolean checkOnHold() { 
      return onHold; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (dieValue == 1) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(23, 23, 5, 5); 
      } else if (dieValue == 2) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(7, 7, 5, 5); 
       g.fillOval(38, 38, 5, 5); 
      } else if (dieValue == 3) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(7, 7, 5, 5); 
       g.fillOval(38, 38, 5, 5); 
       g.fillOval(23, 23, 5, 5); 

      } else if (dieValue == 4) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(7, 7, 5, 5); 
       g.fillOval(38, 38, 5, 5); 
       g.fillOval(7, 38, 5, 5); 
       g.fillOval(38, 7, 5, 5); 
      } else if (dieValue == 5) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(7, 7, 5, 5); 
       g.fillOval(38, 38, 5, 5); 
       g.fillOval(7, 38, 5, 5); 
       g.fillOval(38, 7, 5, 5); 
       g.fillOval(23, 23, 5, 5); 
      } else if (dieValue == 6) { 
       if (onHold == false) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillRoundRect(0, 0, 50, 50, 10, 10); 
       if (onHold == true) { 
        g.setColor(Color.black); 
       } else { 
        g.setColor(Color.white); 
       } 
       g.fillOval(7, 7, 5, 5); 
       g.fillOval(38, 38, 5, 5); 
       g.fillOval(7, 38, 5, 5); 
       g.fillOval(38, 7, 5, 5); 
       g.fillOval(7, 23, 5, 5); 
       g.fillOval(38, 23, 5, 5); 
      } 
     } 
    } 
} 
+0

謝謝你對此的幫助。爲了迴應您對我的代碼的擔憂,我只發佈了適用的部分,並且我沒有顯示更多的代碼。我沒有使用佈局管理器,因爲我遇到了一些麻煩,我使用setBounds()而不是setSize等。 –

+0

但是你不應該在任何paint方法中做,它會消耗你的CPU – MadProgrammer

-1

谷歌「java動畫」。

您已經掌握了事件派發線程(EDT)上的所有內容,因此從來沒有機會真正處理任何事件。

相關問題