如何在JPanel中执行简单的图形动画

时间:2013-04-03 02:03:43

标签: java swing animation jframe 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();
        }
    }
 }

使用repaint()只会导致按下按钮

非常感谢任何帮助

谢谢

2 个答案:

答案 0 :(得分:2)

你基本上违反了Swing的单线程规则。特别是,您正在事件调度线程中执行长时间运行和阻塞操作,以防止它处理重绘请求,因此没有任何工作原因。

您可以使用Swing Timer来解决问题,但SwingWorker更有可能产生更理想的结果。

请查看Concurrency in swing了解详情

更新了示例

我已经完成了你的代码,有很多让我害怕的事情。

  • 您绝不应该在paint方法中修改UI,这将导致重绘管理器安排新的重绘,这将调用您的paint方法,依此类推。 ..

此...

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

这是一个非常糟糕的主意。首先,您不应该依赖setSize,而应该覆盖getPreferredSize。这将允许您使用适当的布局管理器来布局组件。

  • DiePanel中使用“玩家”标志来确定每个骰子应该涂在哪里。

这是一个很糟糕的原因。首先,你实际上并没有跟踪每个玩家的任何方式,因此只有玩家的骰子会被涂上,但每个玩家都会分享相同的掷骰。

你也在为每个玩家重复相同的代码,这是完全浪费。

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);
            }
        }
    }
}

答案 1 :(得分:-1)

谷歌“java动画”。

你已经掌握了事件调度线程(EDT)的所有内容,因此它永远不会有机会真正处理任何事件。