0

我想做的只是掷骰子并有一个掷骰子动画(只是在掷骰子时显示随机骰子值)

到目前为止,我的模具代码:

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() 只是导致按下的按钮被延迟

任何帮助将非常感激

谢谢

4

2 回答 2

2

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

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

查看Concurrency in swing了解更多详情

更新了示例

我浏览了你的代码,有很多让我害怕的事情。

  • 无论如何,您都不应该在paint方法中修改 UI,这将导致重绘管理器安排新的重绘,这将调用您的paint方法等等......

这...

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

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

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

这是一个坏主意,原因有很多。首先,您实际上并没有以任何方式跟踪每个玩家的掷骰,因此只会绘制玩家的骰子,但每个玩家将共享相同的骰子。

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

ADiePanel应该代表单个工作单元,它应该代表单个玩家的结果,或者可以根据需要使用多个面板来产生累积结果。

  • 你不应该依赖“神奇”的数字。

您的绘制代码依赖于组件是给定尺寸的事实,这并不总是可能的,相反,您应该使用组件widthheight值来更好地生成结果或将模具保持在静态尺寸,但更好地定位它,比如在组件的中间。

下面的示例纠正了这些问题中更严重的问题,但旨在演示使用 aSwingWorker来模拟掷骰子。

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);
            }
        }
    }
}
于 2013-04-03T02:07:22.787 回答
-1

谷歌“java动画”。

您已经在事件调度线程 (EDT) 上获得了所有内容,因此它永远没有机会实际处理任何事件。

于 2013-04-03T02:07:41.773 回答