我想要做的只是掷骰子并使用滚动骰子动画(只需在滚动时显示随机骰子值)
我的代码到目前为止为死:
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()只会导致按下按钮
非常感谢任何帮助
谢谢
答案 0 :(得分:2)
你基本上违反了Swing的单线程规则。特别是,您正在事件调度线程中执行长时间运行和阻塞操作,以防止它处理重绘请求,因此没有任何工作原因。
您可以使用Swing Timer
来解决问题,但SwingWorker
更有可能产生更理想的结果。
请查看Concurrency in swing了解详情
更新了示例
我已经完成了你的代码,有很多让我害怕的事情。
paint
方法中修改UI,这将导致重绘管理器安排新的重绘,这将调用您的paint
方法,依此类推。 .. 此...
this.setSize(50,50);
this.setVisible(true);
这是一个非常糟糕的主意。首先,您不应该依赖setSize
,而应该覆盖getPreferredSize
。这将允许您使用适当的布局管理器来布局组件。
DiePanel
中使用“玩家”标志来确定每个骰子应该涂在哪里。这是一个很糟糕的原因。首先,你实际上并没有跟踪每个玩家的任何方式,因此只有玩家的骰子会被涂上,但每个玩家都会分享相同的掷骰。
你也在为每个玩家重复相同的代码,这是完全浪费。
DiePanel
应代表单个工作单元,它应代表单个玩家的结果,或者多个小组可用于根据需要产生累积结果。
您的绘图代码依赖于组件是给定大小的事实,但这并非总是可行,相反,您应该使用组件width
和height
值来更好地生成结果或将模具保持在静态尺寸,但要更好地定位,例如在组件的中间。
以下示例更正了更严重的问题,但旨在演示使用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)的所有内容,因此它永远不会有机会真正处理任何事件。