Ryan
Ryan

Reputation: 1974

Java Program flow

i have been programming in python for a while and have been interested in learning Java for a while now so i figured i would give it a go so have mercy i know this is a infinite loop at the moment so tread carefully.

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

public class snake extends JFrame{
    public static void main(String[] args) {
        JFrame screen = new JFrame("Snake");
        screen.setSize(640, 480);
        screen.setResizable(false);
        screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = screen.getContentPane();
        screen.setVisible(true);
        while(true) {
            pane.add(new Render());
        }
    }

}
class Render extends JComponent {
    Render(){
    }
    public void paint(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0,0,640,480);
        g.setColor(Color.green);
        g.fillRect(100,100,25,25);      
    }   
}

my current goal for this small program is to loop my code so that every time my while loop iterates i would like the flow of code to update the screen and redraw anything so in the future the rectangle could move. From my tests i have been running the first iteration of the loop runs through the method inside of my Render class and then after that it stays in the (i believe that is a constructor in java)

Render() {
}

piece of code.where it cycles through every iteration how i would like it for the method. I have tried to call the method from inside the constructor and that did not work. How can i route the flow of the program so every iteration of my loop the program goes through that method? Thanks for your time.

Upvotes: 0

Views: 109

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347332

Start by taking a look at Painting in AWT and Swing and Performing Custom Painting for more details about how painting in Swing works...

This...

while(true) {
    pane.add(new Render());
}

is going to cause issues. If it doesn't block the Event Dispatching Thread, it will run so fast as it cause other threads to stall (or run more slowly) and simply continuously add new instances of Render to pane, which I'm pretty sure you don't want.

It is generally encouraged to override paintComponent instead of paint, as it can cause less issues. You should also, be convention, call super.paintComponent before doing any custom painting.

Instead, simply create an instance of Render and add it to the frame

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Snake {

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

    public Snake() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Render());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    class Render extends JComponent {

        Render() {
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, 640, 480);
            g.setColor(Color.green);
            g.fillRect(100, 100, 25, 25);
        }
    }
}

You are likely going to want to perform some animation, take a look at Concurrency in Swing and How to use Swing Timers for more details

For example

Upvotes: 2

Related Questions