2013-04-03 25 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)上的所有内容,因此从来没有机会真正处理任何事件。

相关问题