Проверка реакции - Java
Формулировка задачи:
Здравствуйте.
Пользователь должен ввести количество попыток. Далее программа должна “показать” погасшую лампочку (серую кнопку), после определенного промежутка лампочка загорается (кнопка перекрашивается в красный цвет) и пользователь должен нажать на неё. И так должно повторяться введение пользователем количество раз. Код написал, но возникают проблемы:
1)Почему кнопка появляется не сразу. Нужно, что бы вначале появилась кнопка с серым цветом, а потом она перекрасилась в красный цвет. А в программе происходит задержка и кнопка появляется только тогда, когда она загорается красным цветом.
2)Почему кнопка загорается один раз, а не в веденое пользователем количество раз.
3)Программа должна проверять реакцию. То есть должна засекать, сколько времени прошло от начала “горения” точки до нажатия на неё пользователем. Какой функцией нужно засекать время, и каким типом нужно хранить время.
import java.awt.*; import java.awt.event.*; import java.io.IOException; import javax.swing.*; public class Exp { JButton button; JFrame frame; int count; JPanel panel; JTextField field; JButton button1; public static void main(String[] args){ Exp start = new Exp(); start.GUI(); } public void GUI() { panel = new JPanel(); JLabel label = new JLabel("Сколько попыток?"); frame = new JFrame(); field = new JTextField(10); panel.add(label); panel.add(field); button1 = new JButton("Старт"); button1.addActionListener(new Button()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(BorderLayout.NORTH,panel); frame.getContentPane().add(BorderLayout.SOUTH,button1); frame.setSize(500, 500); frame.setVisible(true); } public void go1(){ JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); JPanel panel3 = new JPanel(); JPanel panel4 = new JPanel(); button = new JButton(); button.addActionListener(new Button1()); panel1.setPreferredSize(new Dimension(80,80)); panel2.setPreferredSize(new Dimension(80,80)); panel3.setPreferredSize(new Dimension(80,80)); panel4.setPreferredSize(new Dimension(80,80)); frame.getContentPane().add(BorderLayout.NORTH,panel1); frame.getContentPane().add(BorderLayout.SOUTH,panel2); frame.getContentPane().add(BorderLayout.EAST,panel3); frame.getContentPane().add(BorderLayout.WEST,panel4); frame.getContentPane().add(BorderLayout.CENTER,button); button.setBackground(Color.GRAY); //frame.repaint(); for(int i=0;i<=count;i++){ try { Thread.sleep(30 + (int) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } button.setText("click me"); button.setBackground(Color.RED); } } class Button implements ActionListener { public void actionPerformed (ActionEvent event){ count=Integer.parseInt(field.getText()); frame.remove(panel); frame.remove(button1); go1(); } } class Button1 implements ActionListener { public void actionPerformed (ActionEvent event){ button.setBackground(Color.GRAY); button.setText(""); } } }
Решение задачи: «Проверка реакции»
textual
Листинг программы
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class Exp { JButton button; JFrame frame; int count; JPanel panel; JTextField field; JButton button1; public static void main(String[] args) { Exp start = new Exp(); start.GUI(); } public void GUI() { panel = new JPanel(); JLabel label = new JLabel("Сколько попыток?"); frame = new JFrame(); field = new JTextField(10); panel.add(label); panel.add(field); button1 = new JButton("Старт"); button1.addActionListener(new Button()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(BorderLayout.NORTH, panel); frame.getContentPane().add(BorderLayout.SOUTH, button1); frame.setSize(500, 500); frame.setVisible(true); } public void construct() { JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); JPanel panel3 = new JPanel(); JPanel panel4 = new JPanel(); button = new JButton(); button.addActionListener(new Button1()); panel1.setPreferredSize(new Dimension(80, 80)); panel2.setPreferredSize(new Dimension(80, 80)); panel3.setPreferredSize(new Dimension(80, 80)); panel4.setPreferredSize(new Dimension(80, 80)); frame.getContentPane().add(BorderLayout.NORTH, panel1); frame.getContentPane().add(BorderLayout.SOUTH, panel2); frame.getContentPane().add(BorderLayout.EAST, panel3); frame.getContentPane().add(BorderLayout.WEST, panel4); frame.getContentPane().add(BorderLayout.CENTER, button); button.setBackground(Color.GRAY); } class Button implements ActionListener { public void actionPerformed(ActionEvent event) { count = Integer.parseInt(field.getText()); frame.remove(panel); frame.remove(button1); construct(); frame.getContentPane().validate(); frame.getContentPane().repaint(); Go go1 = new Go(); go1.start(); } } class Button1 implements ActionListener { public void actionPerformed(ActionEvent event) { button.setBackground(Color.GRAY); button.setText(""); } } class Go extends Thread { @Override public void run() { for (int i = 0; i <= count; i++) { try { Thread.sleep(30 + (int) (Math.random() * 5000)); } catch (InterruptedException e) { e.printStackTrace(); } button.setText("click me"); button.setBackground(Color.RED); } button.setVisible(false); Thread.interrupted(); } } }