javaswingpaint

How do I stop my paint method from repeating twice?


Here is the code for a dice game that I am working on that outputs the results to a window. The paint method repeats twice, which is not good for me because I want the dice to roll once and then move on to the next frame. Please someone help me with this problem. Thank you in advance.

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

Solution

  • Take a look at

    For more details about how painting works in Swing and how to achieve what you are trying to do

    Updated with working example

    Snake Eyes

    Cause I'm lazy, I've utilised the Graphics 2D API to draw the dots. I did this because many of the dots appear in the same locations for many of the numbers...

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