Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何阻止我的绘画方法重复两次?_Java_Swing_Paint - Fatal编程技术网

Java 我如何阻止我的绘画方法重复两次?

Java 我如何阻止我的绘画方法重复两次?,java,swing,paint,Java,Swing,Paint,下面是我正在处理的一个骰子游戏的代码,它将结果输出到一个窗口。绘制方法重复两次,这对我来说不好,因为我希望骰子滚动一次,然后移动到下一帧。请有人帮我解决这个问题。先谢谢你 import java.awt.*; import java.util.Random; import javax.swing.*; public class Dice extends JApplet { public static int pause(int n) { try { Thread.sl

下面是我正在处理的一个骰子游戏的代码,它将结果输出到一个窗口。绘制方法重复两次,这对我来说不好,因为我希望骰子滚动一次,然后移动到下一帧。请有人帮我解决这个问题。先谢谢你

import java.awt.*;
import java.util.Random;
import javax.swing.*;

public class Dice extends JApplet {

public static int pause(int n)
{
    try {
        Thread.sleep(n);
        } catch(InterruptedException e) {
    }
    return n;
}

public void Dice() {
    JApplet app = new Dice();
    JFrame frame = new JFrame("Dice Game");
    frame.setBounds(30, 50, 1300, 650);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.add(app);
}

public void paint(Graphics g) {
    int width = getWidth();    
    int height = getHeight(); 

    int num = 0;
    for (int i = 0; i < 7; i++) {
        Random generator= new Random();
        int number = generator.nextInt(6)+1;
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.drawRoundRect(550, 150, 200, 200, 50, 50);
        System.out.println("Test");
        if (number == 1) {              //Roll one
            num = 1;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(640, 240, 20, 20);
            pause(100);
        } if (number == 2) {                //Roll two
            num = 2;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(590, 290, 20, 20);
            g.fillOval(690, 190, 20, 20);
            pause(100);
        } if (number == 3) {                //Roll three
            num = 3;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(590, 290, 20, 20);
            g.fillOval(640, 240, 20, 20);
            g.fillOval(690, 190, 20, 20);
            pause(100);
        } if (number == 4) {                //Roll four
            num = 4;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(590, 290, 20, 20);
            g.fillOval(590, 190, 20, 20);
            g.fillOval(690, 290, 20, 20);
            g.fillOval(690, 190, 20, 20);
            pause(100);
        } if (number == 5) {                //Roll five
            num = 5;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(590, 290, 20, 20);
            g.fillOval(590, 190, 20, 20);
            g.fillOval(640, 240, 20, 20);
            g.fillOval(690, 290, 20, 20);
            g.fillOval(690, 190, 20, 20);
            pause(100);
        } if (number == 6) {                //Roll six
            num = 6;
            g.setColor(new Color (0, 0, 0));
            g.fillOval(590, 190, 20, 20);
            g.fillOval(590, 240, 20, 20);
            g.fillOval(590, 290, 20, 20);
            g.fillOval(690, 190, 20, 20);
            g.fillOval(690, 240, 20, 20);
            g.fillOval(690, 290, 20, 20);
            pause(100);
        }
    }
    g.setFont(new Font("TimesRoman", Font.PLAIN, 20));
    g.drawString("You rolled a " + num, 590, 100);
    pause(1000);
  }
}
import java.awt.*;
导入java.util.Random;
导入javax.swing.*;
公共类骰子扩展JApplet{
公共静态整数暂停(整数n)
{
试一试{
睡眠(n);
}捕捉(中断异常e){
}
返回n;
}
公共无效骰子(){
JApplet app=新骰子();
JFrame=新JFrame(“骰子游戏”);
机架立根(30、50、1300、650);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(app);
}
公共空间涂料(图g){
int width=getWidth();
int height=getHeight();
int num=0;
对于(int i=0;i<7;i++){
随机生成器=新随机();
int编号=发电机。nextInt(6)+1;
g、 setColor(Color.WHITE);
g、 fillRect(0,0,宽度,高度);
g、 设置颜色(颜色为黑色);
g、 drawRoundRect(550、150、200、200、50、50);
系统输出打印(“测试”);
如果(数字==1){//滚动一次
num=1;
g、 setColor(新颜色(0,0,0));
g、 圆形(640240,20,20);
暂停(100);
}如果(数字==2){//滚动二次
num=2;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(69019020);
暂停(100);
}如果(数字==3){//滚动三次
num=3;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(640240,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==4){//滚动四次
num=4;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==5){//滚动五次
num=5;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(640240,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==6){//滚动六次
num=6;
g、 setColor(新颜色(0,0,0));
g、 圆角(590190,20,20);
g、 圆角(590240,20,20);
g、 圆形(59029020);
g、 圆形(69019020);
g、 圆形(690,240,20,20);
g、 圆形(690,290,20,20);
暂停(100);
}
}
g、 setFont(新字体(“TimeRoman”,Font.PLAIN,20));
g、 抽绳(“你掷了一个”+num,590100);
暂停(1000);
}
}
  • 简而言之,你不能。您无法控制何时进行绘制,而绘制是
    重新绘制管理器的域
  • 您也不应该在事件调度线程的上下文中调用
    Thread.sleep
    ,尤其是在任何
    paint
    方法中
  • 您应该避免覆盖
    paint
    ,而是使用
    paintComponent
  • 您应该避免从
    JFrame
    扩展,而是使用类似
    JPanel
    的东西,它实际上有一个
    paintComponent
    方法
  • 这种性质的动画最好通过使用Swing
    定时器来实现,该定时器允许在EDT外部保持暂停,但在EDT内部再次触发暂停,从而更安全地执行绘制和更新
看看

有关如何在Swing中进行绘制以及如何实现所要实现的目标的更多详细信息

使用工作示例更新

因为我很懒,所以我使用了图形2D API来绘制点。我这样做是因为许多点出现在许多数字的相同位置

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DiceRoller {

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

    public DiceRoller() {
        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.add(new Die());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Die extends JPanel {

        private int number = 1;

        public Die() {
            Timer timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    number = (int) (Math.round((Math.random() * 5) + 1));
                    repaint();
                }
            });
            timer.setRepeats(true);
            timer.setInitialDelay(0);
            timer.start();
        }

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

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            int width = getWidth();
            int height = getHeight();

            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, width, height);
            g2d.setColor(Color.BLACK);
            g2d.drawRoundRect(10, 10, width - 20, height - 20, 50, 50);

            List<Shape> dots = new ArrayList<>(6);

            if (number == 1 || number == 3 || number == 5) {
                int x = (width - 20) / 2;
                int y = (height - 20) / 2;
                dots.add(new Ellipse2D.Float(x, y, 20, 20));
            }

            if (number == 2 || number == 3 || number == 4 || number == 5 || number == 6) {

                int x = ((width / 2) - 20) / 2;
                int y = ((height / 2) - 20) / 2;
                dots.add(new Ellipse2D.Float(x, y, 20, 20));
                dots.add(new Ellipse2D.Float(x + (width / 2), y + (height / 2), 20, 20));

            }

            if (number == 4 || number == 5 || number == 6) {

                int x = (width / 2) + (((width / 2) - 20) / 2);
                int y = ((height / 2) - 20) / 2;
                dots.add(new Ellipse2D.Float(x, y, 20, 20));
                dots.add(new Ellipse2D.Float(x - (width / 2), y + (height / 2), 20, 20));

            }

            if (number == 6) {

                int x = (((width / 2) - 20) / 2);
                int y = (height - 20) / 2;
                dots.add(new Ellipse2D.Float(x, y, 20, 20));
                dots.add(new Ellipse2D.Float(x + (width / 2), y, 20, 20));

            }

            for (Shape dot : dots) {
                g2d.fill(dot);
            }

            g2d.dispose();
        }
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Ellipse2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公营掷骰机{
公共静态void main(字符串[]args){
新滚筒();
}
公众掷骰子(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新模具());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类扩展JPanel{
私有整数=1;
公众死亡(){
计时器计时器=新计时器(500,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
number=(int)(Math.round((Math.random