Comment rendre compte à rebours avec la barre de progression?
Comment puis-je faire en sorte que la barre de progression redescend doucement avec la limite de temps?
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
J'aimerais que les gens prennent un coup d'oeil à la QuestionPanel. Je suis en train de faire le compte à rebours, tandis que la barre de progression est également en baisse. Lorsque la minuterie atteint 0 (après départ à 5), un autre groupe est supposé être montré. Un autre problème est que le compte à rebours commence avant même d'arriver à ce groupe; je veux être en mesure de contrôler lorsque le compte à rebours commence.
Saint pavé de texte, Batman! Je voudrais essayer de la condensation de la question vers le bas pour le plus petit d'un exemple que vous pouvez faire.
J'ai fortement deuxième TFRM de la suggestion. C'est juste beaucoup trop de code. Vous aurez à faire quelques efforts pour le rendre à la fois plus petits et compréhensible, mais c'est un effort bien passé. Sinon, beaucoup auront mieux à faire de leur dimanche soir que de lire un volume 3 livre de code.
J'ai 5 lettres pour vous SSCCE. Préparer un SSCCE et il est probable que le problème (et la solution) deviendra clair comme vous le faites. Si cela n'arrive pas, au moins vous aurez un court morceau de code que d'autres personnes sont susceptibles de regarder de plus près. Comme il est, vous nous demandez de chalut par près de 450 lignes de code à la recherche de l'erreur. Votre demande sera probablement ignoré. @HFOE merci pour la mise en forme du code.
Votre programme pourrait bénéficier par votre fait ce, car il pourrait vous aider dans votre objectif de séparer la logique du programme du code de la GUI. Aussi, vous aurez envie de se débarrasser de tout ce que la précision de positionnement et de dimensionnement et au lieu d'utiliser les gestionnaires de mise en page, surtout si vous voulez que les gens avec différentes tailles de moniteurs et les résolutions d'écran pour être en mesure de voir votre interface graphique. Je ne peux pas le voir entièrement sur la mienne par exemple.
Saint pavé de texte, Batman! Je voudrais essayer de la condensation de la question vers le bas pour le plus petit d'un exemple que vous pouvez faire.
J'ai fortement deuxième TFRM de la suggestion. C'est juste beaucoup trop de code. Vous aurez à faire quelques efforts pour le rendre à la fois plus petits et compréhensible, mais c'est un effort bien passé. Sinon, beaucoup auront mieux à faire de leur dimanche soir que de lire un volume 3 livre de code.
J'ai 5 lettres pour vous SSCCE. Préparer un SSCCE et il est probable que le problème (et la solution) deviendra clair comme vous le faites. Si cela n'arrive pas, au moins vous aurez un court morceau de code que d'autres personnes sont susceptibles de regarder de plus près. Comme il est, vous nous demandez de chalut par près de 450 lignes de code à la recherche de l'erreur. Votre demande sera probablement ignoré. @HFOE merci pour la mise en forme du code.
Votre programme pourrait bénéficier par votre fait ce, car il pourrait vous aider dans votre objectif de séparer la logique du programme du code de la GUI. Aussi, vous aurez envie de se débarrasser de tout ce que la précision de positionnement et de dimensionnement et au lieu d'utiliser les gestionnaires de mise en page, surtout si vous voulez que les gens avec différentes tailles de moniteurs et les résolutions d'écran pour être en mesure de voir votre interface graphique. Je ne peux pas le voir entièrement sur la mienne par exemple.
OriginalL'auteur wannabeprogrammer | 2011-05-09
Vous devez vous connecter pour publier un commentaire.
Désolé, je ne pouvais toujours pas à trouver la motivation de lire votre code, mais juste jeté cet exemple basé sur la question. Voir si elle vous donne quelques idées.
Noter que c'est un SSCCE et utilise seulement 40 lignes de code dans tous les.
Andrews code est plus que court, il est aussi compilable, praticable, et testable. Depuis elle est brève, nous pouvons le comprendre rapidement. Depuis qu'il compile et s'exécute à nous tous, nous pouvons exécuter ce code est modifié, les modifier, les améliorer et de corriger les erreurs dans un court laps de temps.
SSCCE et utilise seulement 40 lignes de code dans tous les. +1
OriginalL'auteur Andrew Thompson
De regards de celui-ci, tout ce code est dans un gros fichier Java? C'est une mauvaise idée.
Vous devriez avoir une bonne raison de définir une classe à l'intérieur de la classe, et l'apparence, vous n'en avez pas pour QuestionPanel et autres.
Comme pour le problème, votre
paintComponent
méthode est appelée à chaque fois que votre compteur est mis à jour, qui est maintenant à peu près une fois tous les 0.1 secondes, mais vous ne cochez par 1 pixel sur chaque mise à jour, donc au bout de 5 secondes, vous avez coupé 10*5 pixels (50). Ce que vous devez faire est de mettre à jour la barre de progression par un mécanisme différent, comme un calcul de l'heure actuelle de traitement:J'imagine que c'est pour une mission, mais sinon je suis d'accord avec vous.
je vous remercie de votre entrée pickypg mais est-il une façon de faire de la remaing temps affiché au départ à 5 secondes?
Oui, modifiez la dernière ligne qui dessine à la fois à gauche de la chaîne.
double remaining = 5 * percent; g.drawString(String.format("%.2f", remaining), 100, 80);
j'ai donc remplacer la dernière ligne que u viens de donner à la dernière ligne de code u premier m'a donné? et puis, après ce que j'ai mis ceci dans mon code à l'aide de mes variables et tout shouold être ok? o__o
OriginalL'auteur pickypg
Qui est certainement trop d'informations, et une très vaste question. Je dirais tout au plus vous avez seulement besoin d'inclure le code de la classe où le timer est, et la classe où la barre de progression est tirée.
De parcourir le code, je devine que vous êtes en utilisant un rectangle pour dessiner la barre de progression. Sur cette base, il est possible de le faire serait d'utiliser une variable pour stocker la largeur de la barre, et à chaque fois que la minuterie de tiques, de réduire la largeur de la barre par un montant fixe. Ensuite il suffit de régler la largeur du rectangle dessiné à la valeur stockée dans la variable.
OriginalL'auteur Ryan