Ryan Remer
Ryan Remer

Reputation: 51

Call paint method from game loop at the start of a button

Hi I'm trying to call the paint method every time in a game loop.At the moment the screen pops up with a label and a button once the button has been pressed the label and button go which i want but i can't get the paint method to start i tried j.repaint() & j.validate() neither accessed paint method.Any help would be appreciated.

package sgame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class SGame extends JPanel
{

    public static void main(String[] args)
    {

        final JFrame window = new JFrame("hello");
        final JPanel window1 = new JPanel();
        Timer loop = new Timer(1000, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                GameLoop(window1);

            }
        });
        Window(window, loop);

    }

    public static void Window(final JFrame window, final Timer loop)
    {
        final JButton b1 = new JButton("GO!");
        b1.setLocation(210, 300);
        b1.setSize(70, 50);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(500, 500);
        window.setLocation(420, 170);
        window.setBackground(Color.BLACK);
        final JLabel Title = new JLabel("Snake", JLabel.CENTER);
        Title.setFont(new Font("Times New Roman", Font.ITALIC, 60));
        Title.setVerticalAlignment(JLabel.CENTER);
        Title.setForeground(Color.WHITE);
        window.add(b1);
        window.add(Title);
        b1.addActionListener(new ActionListener() // runs when buttons pressed
            {

                @Override
                public void actionPerformed(ActionEvent e) // clears header,button and starts timer
                {
                    b1.invalidate();
                    b1.setVisible(false);
                    Title.setVisible(false);
                    Title.invalidate();
                    loop.start();
                }

            });

    }

    public static void GameLoop(JPanel j)
    {
        // Call paint method
    }

    public void paintComponent(Graphics g)
    {
        g.setColor(Color.yellow);
        g.drawRect(30, 30, 30, 30);
    }
}

Upvotes: 4

Views: 1279

Answers (1)

phsym
phsym

Reputation: 1384

The paintComponent() method in SGame is never called because you didn't instanciate any SGame object. And window1 has not been added to the frame.

Something like this should be better :

public class SGame extends JPanel {

    private Timer loop;

    public SGame(){
        loop = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gameLoop();
            }
        });
    }

    public static void main(String[] args) {
        final JFrame window = new JFrame("hello");
        final JButton b1 = new JButton("GO!");
        b1.setLocation(210, 300);
        b1.setSize(70, 50);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(500, 500);
        window.setLocation(420, 170);
        window.setBackground(Color.BLACK);
        final JLabel Title = new JLabel("Snake", JLabel.CENTER);
        Title.setFont(new Font("Times New Roman", Font.ITALIC, 60));
        Title.setVerticalAlignment(JLabel.CENTER);
        Title.setForeground(Color.WHITE);
        window.add(b1);
        window.add(Title);
        b1.addActionListener(new ActionListener() { // runs when buttons pressed
            @Override
            public void actionPerformed(ActionEvent e) // clears header,button
            {
                b1.invalidate();
                b1.setVisible(false);
                Title.setVisible(false);
                Title.invalidate();
                SGame sg = new SGame();
                window.add(sg);
                sg.start();
            }
        });;
    }

    public void start(){
        loop.start();
    }

    public void gameLoop() {
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.yellow);
        g.drawRect(30, 30, 30, 30);
    }
}

Upvotes: 1

Related Questions