dieu
dieu

Reputation: 50

Graphics application just shows blank screen

I try to write a code to draw a Oval run from the top left down to the bottom right. But when I run to program, it show the blank screen on app. Why is this happening?

Here is my code:

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

public class SimpleAnimation {
    int x = 70;
    int y = 70;

    public static void main(String[] arg){
        SimpleAnimation gui = new SimpleAnimation();
        gui.go();
    }

    public void go(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyDrawPanel drawPanel = new MyDrawPanel();

        frame.getContentPane().add(drawPanel);
        frame.setSize(300, 300);
        frame.setVisible(true);

        for (int i = 0; i < 130; i++){
            x++;
            y++;

            drawPanel.repaint();

            try{
                Thread.sleep(50);
            } catch(Exception ex){}
        }
    } // close go() method

    class MyDrawPanel extends JPanel{
        @Override
        public void paintComponents(Graphics g) {
            g.setColor(Color.green);
            g.fillOval(x, y, 40, 40);
        }
    } // close inner class
} // close outer class

Upvotes: 1

Views: 221

Answers (2)

STaefi
STaefi

Reputation: 4377

You should Override paintComponent() instead of paintComponents().

So change the public void paintComponents() {...} to public void paintComponent() {...}

But just for the hint:

Try to use Timers instead of Threads. Always try not to mess with the swing thread. In your case you can use javax.swing.Timer to call the repaint in 50 ms intervals:

counter = 0;
t = new Timer(50, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(counter>=130)
            t.stop();

        counter++;
        x++;
        y++;
        drawPanel.repaint();
    }
});
t.start();

javax.swing.Timer t and int counter are member variables for your class.

Good Luck.

Upvotes: 1

Vishal Zanzrukia
Vishal Zanzrukia

Reputation: 4973

You are not calling super.paintComponent(g); and also you need to call paintComponents rather than repaint method. Please try it with below code. I hope it helps :)

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SimpleAnimation {
  int x = 70;
  int y = 70;

  public static void main(String[] arg) {
    SimpleAnimation gui = new SimpleAnimation();
    gui.go();
  }

  public void go() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MyDrawPanel drawPanel = new MyDrawPanel();

    frame.getContentPane().add(drawPanel);
    frame.setSize(300, 300);
    frame.setVisible(true);



    for (int i = 0; i < 130; i++) {
      x++;
      y++;

      drawPanel.paintComponents(drawPanel.getGraphics());

      try {
        Thread.sleep(50);
      } catch (Exception ex) {
      }
    }
  } // close go() method

  class MyDrawPanel extends JPanel {
    @Override
    public void paintComponents(Graphics g) {
      // TODO Auto-generated method stub
      super.paintComponent(g); 
      g.drawOval(50, 50, 50, 50);
      g.setColor(Color.green);
      g.fillOval(x, y, 40, 40);
    }
  } // close inner class
} // close outer class

Upvotes: 0

Related Questions