-1

I have researched for some time different methods to schedule a task after a certain amount of time (ie. Quartz, ScheduledThreadPool, java.util.timer) and I'm having problems understanding how to use it.

Here is just an example I found from my research and below I will insert the code that I'm creating. --->

import java.util.Timer;
import java.util.TimerTask;

public class TaskManager {

    private Timer timer = new Timer();

    public static void main(String[] args) {
        TaskManager manager = new TaskManager();
        manager.startTask();
    }

    public void startTask() {
        timer.schedule(new PeriodicTask(), 0);
    }

    private class PeriodicTask extends TimerTask {
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis() + " Running");

            /* replace with the actual task */
            try {
                Thread.sleep(15 * 1000);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            /* end task processing */

            System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now");
            timer.schedule(new PeriodicTask(), 10 * 1000);
        }
    }
}

Please ignore GUI App method, i just inserted it in for clarity. Also i understand that my code may be unorganized so im sorry in advance for that.

So basically i have created a GUI with three frames; first is just the start frame so that can be ignored. The second frame is the one that will basically use the timer. What im trying to do is create a memory game that displays 12 random numbers from 1 to 12 in an array of 12 JButtons (this i have already) and then after a specified amount of time removes or hides(whichever is better) the numbers and the person who is playing has to click them in ascending order. If the person does click them correctly he/she will get 1 point, if not the person gets no points. He than clicks the "Check Answer" button and the numbers reset and the timer starts again. This will only happen 15 times.

And just for clarity all the help i need is with implementing the timer attribute. Thank you to anyone who takes the time to read this. You are a life saver!

// The "TryTryTryAgain" class.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
import java.util.Arrays;
import java.util.TimerTask;
import java.util.Date;
import java.util.Timer;


public class JavaMemoryGame_Final {
  static JButton btnStart, buttonArray[] = new JButton[12];
  static JFrame start, questions, survey;
  static JTextField nameEnter;
  static JLabel scoreOutput, lblTitle, lblPrompt1, lblPrompt2, t_fImage, lblInstruct, lblReadyCheck;
  static JRadioButton reallyBad, bad, good, reallyGood;
  static AudioClip clap, yess, noo;
  static ButtonGroup finalSurvey;
  static DefaultListModel listModel;
  static JList difficulty;
  static int randNumGenerator;
  static int score = 0, arrayImage[] = new int[12];


  private Timer timer = new Timer();


  public static JButton[] randNum() {

    arrayImage[0] = (int)(Math.random() * 12) + 1;
    arrayImage[1] = (int)(Math.random() * 12) + 1;
    while (arrayImage[1] == arrayImage[0]) {
      arrayImage[1] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[2] = (int)(Math.random() * 12) + 1;
    while (arrayImage[2] == arrayImage[1] || arrayImage[2] == arrayImage[0]) {
      arrayImage[2] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[3] = (int)(Math.random() * 12) + 1;
    while (arrayImage[3] == arrayImage[2] || arrayImage[3] == arrayImage[1] || arrayImage[3] == arrayImage[0]) {
      arrayImage[3] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[4] = (int)(Math.random() * 12) + 1;
    while (arrayImage[4] == arrayImage[3] || arrayImage[4] == arrayImage[2] || arrayImage[4] == arrayImage[1] || arrayImage[4] == arrayImage[0]) {
      arrayImage[4] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[5] = (int)(Math.random() * 12) + 1;
    while (arrayImage[5] == arrayImage[4] || arrayImage[5] == arrayImage[3] || arrayImage[5] == arrayImage[2] || arrayImage[5] == arrayImage[1] || arrayImage[5] == arrayImage[0]) {
      arrayImage[5] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[6] = (int)(Math.random() * 12) + 1;
    while (arrayImage[6] == arrayImage[5] || arrayImage[6] == arrayImage[4] || arrayImage[6] == arrayImage[3] || arrayImage[6] == arrayImage[2] || arrayImage[6] == arrayImage[1] || arrayImage[6] == arrayImage[0]) {
      arrayImage[6] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[7] = (int)(Math.random() * 12) + 1;
    while (arrayImage[7] == arrayImage[6] || arrayImage[7] == arrayImage[5] || arrayImage[7] == arrayImage[4] || arrayImage[7] == arrayImage[3] || arrayImage[7] == arrayImage[2] || arrayImage[7] == arrayImage[1] || arrayImage[7] == arrayImage[0]) {
      arrayImage[7] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[8] = (int)(Math.random() * 12) + 1;
    while (arrayImage[8] == arrayImage[7] || arrayImage[8] == arrayImage[6] || arrayImage[8] == arrayImage[5] || arrayImage[8] == arrayImage[4] || arrayImage[8] == arrayImage[3] || arrayImage[8] == arrayImage[2] || arrayImage[8] == arrayImage[1] || arrayImage[8] == arrayImage[0]) {
      arrayImage[8] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[9] = (int)(Math.random() * 12) + 1;
    while (arrayImage[9] == arrayImage[8] || arrayImage[9] == arrayImage[7] || arrayImage[9] == arrayImage[6] || arrayImage[9] == arrayImage[5] || arrayImage[9] == arrayImage[4] || arrayImage[9] == arrayImage[3] || arrayImage[9] == arrayImage[2] || arrayImage[9] == arrayImage[1] || arrayImage[9] == arrayImage[0]) {
      arrayImage[9] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[10] = (int)(Math.random() * 12) + 1;
    while (arrayImage[10] == arrayImage[9] || arrayImage[10] == arrayImage[8] || arrayImage[10] == arrayImage[7] || arrayImage[10] == arrayImage[6] || arrayImage[10] == arrayImage[5] || arrayImage[10] == arrayImage[4] || arrayImage[10] == arrayImage[3] || arrayImage[10] == arrayImage[2] || arrayImage[10] == arrayImage[1] || arrayImage[10] == arrayImage[0]) {
      arrayImage[10] = (int)(Math.random() * 12) + 1;
    }
    arrayImage[11] = (int)(Math.random() * 12) + 1;
    while (arrayImage[11] == arrayImage[10] || arrayImage[11] == arrayImage[9] || arrayImage[11] == arrayImage[8] || arrayImage[11] == arrayImage[7] || arrayImage[11] == arrayImage[6] || arrayImage[11] == arrayImage[5] || arrayImage[11] == arrayImage[4] || arrayImage[11] == arrayImage[3] || arrayImage[11] == arrayImage[2] || arrayImage[11] == arrayImage[1] || arrayImage[11] == arrayImage[0]) {
      arrayImage[11] = (int)(Math.random() * 12) + 1;
    }

    for (int x = 0; x <= 11; x++) {
      buttonArray[x] = new JButton("" + arrayImage[x]);
      buttonArray[x].setBackground(Color.orange);
    }
    for (int i = 0; i <= 11; i++) {
      buttonArray[i].setActionCommand("" + arrayImage[i]);

    }

    return buttonArray;
  }


  private static void guiApp() {

    start = new JFrame("Welcome");
    start.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    questions = new JFrame("Memry_Game");
    questions.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    survey = new JFrame("How Was It?");
    survey.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    btnStart = new JButton("Enter");

    lblTitle = new JLabel("Memory Match Game!");
    lblInstruct = new JLabel("Welcome to the Memory Match Game!");
    lblPrompt1 = new JLabel("Please enter your first name:");
    lblPrompt2 = new JLabel("Choose Difficulty (#of seconds):");
    nameEnter = new JTextField("");
    scoreOutput = new JLabel("Score: " + score + "/15");
    reallyBad = new JRadioButton("Really Bad");
    bad = new JRadioButton("Bad");
    good = new JRadioButton("Good");
    reallyGood = new JRadioButton("Really Good");
    lblReadyCheck = new JLabel("");

    finalSurvey = new ButtonGroup();
    finalSurvey.add(reallyBad);
    finalSurvey.add(bad);
    finalSurvey.add(good);
    finalSurvey.add(reallyGood);



    //Declare Audio
    /*URL ebob = JavaMemoryGame_Final.class.getResource ("");
    clap = Applet.newAudioClip (ebob);
    URL bob = JavaMemoryGame_Final.class.getResource ("yes-1.wav");
    yess = Applet.newAudioClip (bob);
    URL tom = JavaMemoryGame_Final.class.getResource ("no-6.wav");
    noo = Applet.newAudioClip (tom);*/

    //set up radio buttons
    finalSurvey = new ButtonGroup();
    finalSurvey.add(reallyBad);
    finalSurvey.add(bad);
    finalSurvey.add(good);
    finalSurvey.add(reallyGood);

    //Set Up List Model
    listModel = new DefaultListModel();
    listModel.addElement("10");
    listModel.addElement("15");
    listModel.addElement("30");

    //Set Up List
    difficulty = new JList(listModel);
    difficulty.setVisibleRowCount(1);
    JScrollPane listScroll = new JScrollPane(difficulty);



    for (int x = 0; x <= 11; x++) {
      buttonArray[x] = new JButton("");
      buttonArray[x].setBackground(Color.orange);
    }


    ButtonHandler onClick = new ButtonHandler();
    btnStart.addActionListener(onClick);
    for (int y = 0; y <= 11; y++) {
      buttonArray[y].addActionListener(onClick);
    }



    JPanel mainStart = new JPanel(new BorderLayout());
    mainStart.setBackground(Color.orange);
    mainStart.setForeground(Color.orange);
    JPanel scoreStuffs = new JPanel(new GridLayout(1, 2));
    JPanel mainContent = new JPanel(new GridLayout(2, 2));
    mainContent.setBackground(Color.orange);
    mainStart.setForeground(Color.orange);
    JPanel gameBoard = new JPanel(new GridLayout(2, 6));
    gameBoard.setBackground(Color.orange);
    JPanel gameContent = new JPanel(new GridLayout(1, 2));
    JPanel mainGame = new JPanel(new BorderLayout());
    mainGame.setBackground(Color.orange);
    JPanel buttonScore = new JPanel(new GridLayout(3, 1));
    buttonScore.setBackground(Color.orange);
    JPanel feedbackPanel = new JPanel(new BorderLayout());
    feedbackPanel.setForeground(Color.blue);



    //Seperate Panels
    mainContent.add(lblPrompt1);
    mainContent.add(lblPrompt2);
    mainContent.add(nameEnter);
    mainContent.add(listScroll);

    //Score Stuff for main Panel
    scoreStuffs.add(scoreOutput);
    scoreStuffs.add(btnStart);


    //Main Welcome PAnel
    mainStart.add(lblInstruct, BorderLayout.NORTH);
    mainStart.add(mainContent, BorderLayout.CENTER);
    mainStart.add(scoreStuffs, BorderLayout.SOUTH);


    //GAme Board
    gameContent.add(btnStart);
    gameContent.add(scoreOutput);
    gameBoard.add(buttonArray[0]);
    gameBoard.add(buttonArray[1]);
    gameBoard.add(buttonArray[2]);
    gameBoard.add(buttonArray[3]);
    gameBoard.add(buttonArray[4]);
    gameBoard.add(buttonArray[5]);
    gameBoard.add(buttonArray[6]);
    gameBoard.add(buttonArray[7]);
    gameBoard.add(buttonArray[8]);
    gameBoard.add(buttonArray[9]);
    gameBoard.add(buttonArray[10]);
    gameBoard.add(buttonArray[11]);


    mainGame.add(gameBoard, BorderLayout.CENTER);
    mainGame.add(gameContent, BorderLayout.PAGE_END);



    Container contentPane = start.getContentPane();
    contentPane.add(mainStart);
    Container contentPane1 = questions.getContentPane();
    contentPane1.add(mainGame);
    Container contentPane2 = survey.getContentPane();
    contentPane2.add(feedbackPanel);
    start.setSize(600, 450);
    start.setVisible(true);
    questions.setSize(500, 250);
    questions.setVisible(true);
    survey.setSize(600, 450);
    survey.setVisible(true);



  }




  private static class ButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String textFieldValue = nameEnter.getText();
      int index = difficulty.getSelectedIndex();
      int selected = difficulty.getSelectedValue().toInt();
      int check = 0;

      while (check == 0) {
        if (e.getSource() == ("Enter") && textFieldValue.length() != 0 && index > 0) {
          lblPrompt1.setText("Thank You!");
          lblPrompt2.setText("Thank You!");
          btnStart.setText("Start?");
          check = check + 1;
        } else if (e.getSource() == ("Enter") && textFieldValue.length() == 0) {
          lblPrompt1.setText("Enter first name before continuing!");
          btnStart.setText("Check");
        }
      }

      if (e.getSource() == ("Start?")) {
        start.setVisible(false);
        questions.setVisible(true);

      }





    }
  }


  public void startTask() {
    timer.schedule(new PeriodicTask(), 0);
  }



  private class PeriodicTask extends TimerTask {@
    Override
    public void run() {
      System.out.println(System.currentTimeMillis() + " Running");

      /* replace with the actual task */
      try {
        Thread.sleep(15 * 1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      /* end task processing */

      System.out.println(System.currentTimeMillis() + " Scheduling 10 seconds from now");
      timer.schedule(new PeriodicTask(), 10 * 1000);
    }
  }



  public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            guiApp();
          }
        }


      );


    } // main method
} // TryTryTryAgain class
Toni
  • 5
  • 5

2 Answers2

0

Use java.awt.event.ActionListener.

import java.awt.event.*;
Timer t = new Timer(10, //will run every 10 ms
                    new Listener());
t.start();

private class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e){
        //Code here will execute every (10) ms.
    }
}
RobotKarel314
  • 417
  • 3
  • 14
  • How would i use the Listener class to change the layout of the frame if it were called by the button handler method. For instance a button was clicked, the button handler was notified, and now i want to tell the Listener class to execute its code once. How would i reference it? – Toni May 22 '16 at 18:10
  • Inside actionPerformed(), call another method elsewhere in your program. Then, when the button is pressed, call that same method from inside your handler. – RobotKarel314 May 22 '16 at 18:20
0

I believe that there is some confusion. The Timer class creates a new Thread and runs tasks on that thread to be either a specified time in the future or to run the task repeatedly at a specified interval. The following code describes a Swing class that moves a red dot at two second intervals. The Thread.sleep method causes the thread that it is contained in to wait a specified period. (The sleep can be interrupted by various events.) Your first use of a timer is really a dummy, since the zero used for delay means that the task is run with zero delay.

Your PeriodicTask class prints a message, waits fifteen seconds, prints a message, schedules a repeat of the task 10 seconds later, and then exits.

package bradleyross.swing;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.lang.reflect.InvocationTargetException;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
 * This Swing demo creates a JPanel component and randomly 
 * moves a red dot within the panel when triggered by a
 * timer.
 * 
 * @author Bradley Ross
 *
 */
public class SwingTimer implements Runnable{
    protected JFrame mainFrame;
    protected FlowLayout layout;
    protected MyPanel panel;
    protected int xPos = 0;
    protected int yPos = 0;
    protected Random random = new Random();
    protected Timer timer = new Timer();
    public void run() {
        buildFrame();
    }
    /**
     * Action listener for this application.
     * @author Bradley Ross
     *
     */
    protected class Listener1 implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            System.out.println("Action " + e.getActionCommand());
        }

    }
    /**
     * Key listener for this application.
     * @author Bradley Ross
     *
     */
    protected class Listener2 implements KeyListener {
        /** 
         * Action when key event is detected.
         *  @param e key event
         */
        public void keyTyped(KeyEvent e) {
            System.out.println("Keystroke received " + e.getKeyChar());
        }
        public void keyPressed(KeyEvent e) { ; }
        public void keyReleased(KeyEvent e) { ; }

    }
    /**
     * This subclass of JPanel repaints the
     * the dot using {@link SwingTimer#xPos} and 
     * {@link SwingTimer#yPos}.
     * 
     * @author Bradley Ross
     *
     */
    @SuppressWarnings("serial")
    public class MyPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillOval(xPos,  yPos, 5, 5);
        }
    }
    /**
     * Executed each time the timer triggers an event.
     * 
     * <p>It randomly repositions the dot within the
     *    panel.</p>
     * @author Bradley Ross
     *
     */
    public class Motion extends TimerTask {
        public void run() {
            xPos = random.nextInt(300);
            yPos = random.nextInt(300);
            panel.repaint();
        }
    }
    public void buildFrame() {
        xPos = random.nextInt(300);
        yPos = random.nextInt(300);
        KeyListener listener2 = new Listener2();
        ActionListener listener1 = new Listener1();
        mainFrame = new JFrame();
        layout = new FlowLayout(FlowLayout.LEADING);
        mainFrame.setLayout(layout);
        mainFrame.addKeyListener(listener2);
        JButton first = new JButton("First");
        first.setActionCommand("first");
        first.addActionListener(listener1);
        first.addKeyListener(listener2);
        first.setFocusable(false);
        mainFrame.add(first);
        mainFrame.setFocusable(true);
        panel = new MyPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.black));
        panel.setPreferredSize(new Dimension(300,300));
        panel.setForeground(Color.red);
        panel.addKeyListener(listener2);
        panel.repaint();
        timer.scheduleAtFixedRate(new Motion(), 0  , 2000);
        mainFrame.add(panel);
        mainFrame.setSize(500, 500);
        mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainFrame.setVisible(true);
    }
    /**
     * Main driver.
     * @param args not used in this example
     */
    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new SwingTimer());
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Bradley Ross
  • 445
  • 2
  • 8