我正在尝试使用 java.util.timer 定期安排任务;我不知道怎么办
I'm trying to use java.util.timer to schedule a task periodically; i'm not sure how
我研究了一段时间后在一定时间后安排任务的不同方法(即 Quartz、ScheduledThreadPool、java.util.timer),但我在理解如何使用它时遇到了问题。
这只是我从研究中找到的一个示例,下面我将插入我正在创建的代码。
--->
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);
}
}
}
请忽略 GUI App 方法,为了清楚起见,我只是将其插入。我也知道我的代码可能没有组织,所以我提前为此感到抱歉。
基本上我已经创建了一个包含三个框架的 GUI; first 只是起始帧,因此可以忽略。第二帧基本上会使用定时器。我想做的是创建一个记忆游戏,在 12 个 JButtons 的数组中显示从 1 到 12 的 12 个随机数(我已经这样做了),然后在指定的时间后删除或隐藏(以更好的为准)数字和正在玩的人必须按升序点击它们。如果此人确实点击正确 he/she 将获得 1 分,否则该人将得不到任何分数。然后他点击 "Check Answer" 按钮,数字重置,计时器再次启动。这只会发生 15 次。
为了清楚起见,我需要的所有帮助都是实现计时器属性。感谢所有花时间阅读本文的人。你是救命恩人!
// 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
使用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.
}
}
我认为有些混乱。计时器 class 创建一个新线程和该线程上的 运行s 任务,以在未来的指定时间或以指定的时间间隔重复执行任务。下面的代码描述了一个以两秒为间隔移动一个红点的 Swing class。 Thread.sleep 方法导致包含它的线程等待指定的时间段。 (睡眠可能会被各种事件打断。)您第一次使用计时器实际上是一个假人,因为用于延迟的零意味着任务是 运行,延迟为零。
您的 PeriodicTask class 打印一条消息,等待 15 秒,打印一条消息,安排 10 秒后重复该任务,然后退出。
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();
}
}
}
我研究了一段时间后在一定时间后安排任务的不同方法(即 Quartz、ScheduledThreadPool、java.util.timer),但我在理解如何使用它时遇到了问题。
这只是我从研究中找到的一个示例,下面我将插入我正在创建的代码。 --->
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);
}
}
}
请忽略 GUI App 方法,为了清楚起见,我只是将其插入。我也知道我的代码可能没有组织,所以我提前为此感到抱歉。
基本上我已经创建了一个包含三个框架的 GUI; first 只是起始帧,因此可以忽略。第二帧基本上会使用定时器。我想做的是创建一个记忆游戏,在 12 个 JButtons 的数组中显示从 1 到 12 的 12 个随机数(我已经这样做了),然后在指定的时间后删除或隐藏(以更好的为准)数字和正在玩的人必须按升序点击它们。如果此人确实点击正确 he/she 将获得 1 分,否则该人将得不到任何分数。然后他点击 "Check Answer" 按钮,数字重置,计时器再次启动。这只会发生 15 次。
为了清楚起见,我需要的所有帮助都是实现计时器属性。感谢所有花时间阅读本文的人。你是救命恩人!
// 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
使用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.
}
}
我认为有些混乱。计时器 class 创建一个新线程和该线程上的 运行s 任务,以在未来的指定时间或以指定的时间间隔重复执行任务。下面的代码描述了一个以两秒为间隔移动一个红点的 Swing class。 Thread.sleep 方法导致包含它的线程等待指定的时间段。 (睡眠可能会被各种事件打断。)您第一次使用计时器实际上是一个假人,因为用于延迟的零意味着任务是 运行,延迟为零。
您的 PeriodicTask class 打印一条消息,等待 15 秒,打印一条消息,安排 10 秒后重复该任务,然后退出。
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();
}
}
}