tiempo temporizador segundero regresivo hilos ejemplos cronometro contador con java swing timer long-integer jprogressbar

java - segundero - ¿Cómo hacer la cuenta regresiva del temporizador junto con la barra de progreso?



temporizador en java con hilos (3)

Definitivamente esa es demasiada información y una pregunta muy amplia. Diría que a lo sumo solo necesita incluir el código de la clase donde está el temporizador y la clase donde se dibuja la barra de progreso.

Desde rozar el código, supongo que estás usando un rectángulo para dibujar la barra de progreso. Basado en eso, una forma de hacerlo sería usar una variable para almacenar el ancho de la barra, y cada vez que el temporizador marque, disminuya el ancho de la barra en una cantidad determinada. Luego, simplemente establece el ancho del rectángulo dibujado al valor almacenado en la variable.

¿Cómo puedo hacerlo para que la barra de progreso disminuya lentamente con el límite de tiempo?

class GamePanel extends JPanel implements MouseListener, ActionListener { private JButton quit; private JButton q; private Font loadFont; public GamePanel() { setBackground(Color.blue); // sets background color this.setLayout(null); quit = new JButton("Quit"); quit.addActionListener(this); quit.setBounds(550, 700, 100, 30); this.add(quit); q = new JButton("Questions"); q.addActionListener(this); q.setBounds(100, 100, 120, 30); this.add(q); loadFont = new Font("Serif", Font.PLAIN, 30); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.black); g.fillRect(80, 100, 610, 560); g.setColor(Color.white); g.fillRect(90, 110, 110, 100);// 1st column g.fillRect(90, 220, 110, 100);// g.fillRect(90, 330, 110, 100);// g.fillRect(90, 440, 110, 100);// g.fillRect(90, 550, 110, 100);// g.fillRect(210, 110, 110, 100);// 2nd column g.fillRect(210, 220, 110, 100);// g.fillRect(210, 330, 110, 100);// g.fillRect(210, 440, 110, 100);// g.fillRect(210, 550, 110, 100);// g.fillRect(330, 110, 110, 100);// 3rd column g.fillRect(330, 220, 110, 100);// g.fillRect(330, 330, 110, 100);// g.fillRect(330, 440, 110, 100);// g.fillRect(330, 550, 110, 100);// g.fillRect(450, 110, 110, 100);// 4th column g.fillRect(450, 220, 110, 100);// g.fillRect(450, 330, 110, 100);// g.fillRect(450, 440, 110, 100);// g.fillRect(450, 550, 110, 100);// g.fillRect(570, 110, 110, 100);// 5th column g.fillRect(570, 220, 110, 100);// g.fillRect(570, 330, 110, 100);// g.fillRect(570, 440, 110, 100);// g.fillRect(570, 550, 110, 100);// g.setColor(Color.green); g.setFont(loadFont); g.drawString(input + ":", 100, 710); } public void actionPerformed(ActionEvent e) { String order = e.getActionCommand(); if(order.equals("Quit")) cards.show(c, "Introduction"); if(order.equals("Questions")) cards.show(c, "Questions"); } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } class QuestionPanel extends JPanel implements ActionListener { private long startTime, elapsedTime; private Timer timer; private int countdown; private Font loadFont; public QuestionPanel() { setBackground(Color.pink); // sets background color this.setLayout(null); // moved into constructor from ActionPerformed: only change layout in constructor startTime = 0; elapsedTime = 0; countdown = 590; loadFont = new Font("Segoe Script", Font.BOLD, 20); if(timer == null) {// use the biggest value possible that provides your desired time keeping precision (usually no less than 15 on Windows) timer = new Timer(100, this); startTime = System.currentTimeMillis(); // gets start time in milliseconds timer.start(); } } public void paintComponent(Graphics g) { super.paintComponent(g); g.fillRect(100, 100, 600, 25); g.setColor(Color.green); g.fillRect(105, 105, countdown, 15); g.setColor(Color.black); g.setFont(loadFont); g.drawString("" + ((System.currentTimeMillis() - startTime) / 1000.0), 100, 80); // display remaining time } public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); elapsedTime = System.currentTimeMillis() - startTime; if(elapsedTime < (5000)) { countdown--; repaint(); } else { timer.stop(); if(timer == null) { timer = new Timer(500, this); timer.start(); } } if(elapsedTime >= (5000)) // can''t use == here because of limited precision of system clock cards.show(c, "Correct!"); } } class AnswerPanel extends JPanel implements ActionListener { private JButton revert; public AnswerPanel() { setBackground(Color.yellow); // sets background color this.setLayout(null); revert = new JButton("Back"); revert.addActionListener(this); revert.setBounds(340, 700, 100, 30); this.add(revert); } public void paintComponent(Graphics g) { super.paintComponent(g); } public void actionPerformed(ActionEvent e) { String directive = e.getActionCommand(); if(directive.equals("Back")) cards.show(c, "Start"); } } class FailPanel extends JPanel implements ActionListener { private JButton turnaround; public FailPanel() { setBackground(Color.green); // sets background color this.setLayout(null); turnaround = new JButton("Back"); turnaround.addActionListener(this); turnaround.setBounds(340, 700, 100, 30); this.add(turnaround); } public void paintComponent(Graphics g) { super.paintComponent(g); } public void actionPerformed(ActionEvent e) { String bidding = e.getActionCommand(); if(bidding.equals("Back")) cards.show(c, "Start"); } } }// end of the entire program


Por lo que se ve, ¿todo este código está dentro de un gran archivo Java? Esa es una mala idea

Deberías tener una buena razón para definir una clase como una clase interna, y por lo que parece, no tienes una para QuestionPanel y otras.

En cuanto al problema, se llama a su método paintComponent cada vez que se actualiza su contador, que es ahora aproximadamente una vez cada 0.1 segundos, sin embargo, solo marca 1 píxel en cada actualización, por lo que al cabo de 5 segundos, ha cortado fuera de 10 * 5 píxeles (50). Lo que debe hacer es actualizar la barra de progreso mediante un mecanismo diferente, como el cálculo de la hora actual procesada:

long processed = System.currentTimeMillis() - startTime; double percent = Math.max(0, 1 - processed / 5000.0); int width = (int)(590 * percent);


Lo siento, todavía no pude encontrar la motivación para leer tu código, pero simplemente lancé este ejemplo basado en la pregunta. Vea si le da algunas ideas.

Tenga en cuenta que es un SSCCE y utiliza solo 40 líneas de código en total.

import java.awt.event.*; import javax.swing.*; class CountDownProgressBar { Timer timer; JProgressBar progressBar; CountDownProgressBar() { progressBar = new JProgressBar(JProgressBar.VERTICAL, 0, 10); progressBar.setValue(10); ActionListener listener = new ActionListener() { int counter = 10; public void actionPerformed(ActionEvent ae) { counter--; progressBar.setValue(counter); if (counter<1) { JOptionPane.showMessageDialog(null, "Kaboom!"); timer.stop(); } } }; timer = new Timer(1000, listener); timer.start(); JOptionPane.showMessageDialog(null, progressBar); } public static void main(String[] args) { SwingUtilities.invokeLater( new Runnable() { public void run() { CountDownProgressBar cdpb = new CountDownProgressBar(); } }); } }