Search code examples
javaswingcolorboxjapplet

ColorBox without JApplet


i am currently working on app in which boxes change colors randomly. However, I don't know how to get rid of JApplet and write it in the other way. BTW it's a code from 'Thinking in java'. I would like to make some additional changes, but it is impossible for me because of JApplet :/

As far as I know, JApplet is used for Web pages which is unnecessary in this case

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Random;

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

class CBox extends JPanel implements Runnable {
  private Thread t;

  private int pause;

  private static final Color[] colors = { Color.BLACK, Color.BLUE,
      Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN,
      Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK,
      Color.RED, Color.WHITE, Color.YELLOW };

  private static Random rand = new Random();

  private static final Color newColor() {
    return colors[rand.nextInt(colors.length)];
  }

  private Color cColor = newColor();

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(cColor);
    Dimension s = getSize();
    g.fillRect(0, 0, s.width, s.height);
  }

  public CBox(int pause) {
    this.pause = pause;
    t = new Thread(this);
    t.start();
  }

  public void run() {
    while (true) {
      cColor = newColor();
      repaint();
      try {
        t.sleep(pause);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    }
  }
}

public class ColorBoxes extends JApplet {
  private boolean isApplet = true;

  private int grid = 12;

  private int pause = 50;

  public void init() {

    if (isApplet) {
      String gsize = getParameter("grid");
      if (gsize != null)
        grid = Integer.parseInt(gsize);
      String pse = getParameter("pause");
      if (pse != null)
        pause = Integer.parseInt(pse);
    }
    Container cp = getContentPane();
    cp.setLayout(new GridLayout(grid, grid));
    for (int i = 0; i < grid * grid; i++)
      cp.add(new CBox(pause));
  }

  public static void main(String[] args) {
    ColorBoxes applet = new ColorBoxes();
    applet.isApplet = false;
    if (args.length > 0)
      applet.grid = Integer.parseInt(args[0]);
    if (args.length > 1)
      applet.pause = Integer.parseInt(args[1]);
    run(applet, 500, 400);
  }

  public static void run(JApplet applet, int width, int height) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(applet);
    frame.setSize(width, height);
    applet.init();
    applet.start();
    frame.setVisible(true);
  }
} 

Solution

  • The basic idea is to get rid of all references to JApplet. This means getting rid of the init method and moving the content of the run method into the main method and rather then building the UI on the applet, build it on the JFrame

    For example...

    public class ColorBoxes {
      private int grid = 12;
      private int pause = 50;
    
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                ColorBoxes applet = new ColorBoxes();
                if (args.length > 0) {
                  grid = Integer.parseInt(args[0]);
                }
                if (args.length > 1) {
                  pause = Integer.parseInt(args[1]);
                }
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(grid, grid));
                for (int i = 0; i < grid * grid; i++){
                    frame.add(new CBox(pause));
                }
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
      }
    
    }   
    

    I've not tried compiling this (typed directly into the answer), so there might be some "typos", but I'm sure you can figure those out ;)

    I also think you need to find a more updated copy of "Thinking in java"