Rafraîchissement événement dans un JFrame
lallana2re
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, j'ai un petit probleme , en fait je voulais qu'à chaque fois que je clique sur le bouton "start" la progression de la ligne se produit immédiatement mais ce n'est pas le cas il faut que je redimensionne la fenetre pour pouvoir voir ce qui s'est produit .
Votre aide fera du bien .
j'ai deux classe la classe TestLevel.java(qui contient le dessin) et Demarrage.java(fenetre : qui demarre le programme).
- classe TestLevel.java :
- classe Demarrage.java :
Votre aide fera du bien .
j'ai deux classe la classe TestLevel.java(qui contient le dessin) et Demarrage.java(fenetre : qui demarre le programme).
- classe TestLevel.java :
package AssaneCauchemar; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.function.Consumer; import javax.swing.JPanel; import javax.swing.Timer; public class TestLevel extends JPanel implements ActionListener{ Consumer<Graphics> instruction = g->{}; int dx=0; Timer progress = new Timer(10,this); public TestLevel(){ super(); progress.start(); setPreferredSize(new Dimension(200,300)); } public void paint(Graphics g) { g.setColor(Color.RED); instruction.accept(g); } @Override public void actionPerformed(ActionEvent arg0) { dx++; repaint(); } public void replay(Consumer<Graphics> instruction) { this.instruction= instruction; repaint(); } }
- classe Demarrage.java :
package AssaneCauchemar; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Demarrage { Dimension dimension = new Dimension(500,300); JPanel conteneur,containDessin; JFrame fenetre ; TestLevel dessin = new TestLevel(); public Demarrage() { JButton bouton; conteneur = new JPanel(); containDessin = new JPanel(); bouton = new JButton("start"); fenetre = new JFrame(); fenetre.add(conteneur); conteneur.add(bouton); bouton.addActionListener(e->{ dessin.replay(g->g.drawLine(10+dessin.dx,10,10,10)); fenetre.add(dessin,BorderLayout.SOUTH); }); fenetre.setVisible(true); fenetre.setDefaultCloseOperation(fenetre.EXIT_ON_CLOSE); fenetre.setSize(dimension); } public static void main(String[] args) { new Demarrage(); } }
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Rafraîchissement événement dans un JFrame
- Creer un evenement sur whatsapp - Accueil - WhatsApp
- Un evenement inattendu s'est produit league of legends - Forum Jeux PC
- Impossible de changer la fréquence de rafraîchissement - Forum Matériel & Système
- Problème de connexion league of legend ✓ - Forum jeux en ligne
- Problème taux de rafraîchissement ✓ - Forum Ecran
1 réponse
Bonjour,
Ton code me paraissait trop compliqué pour le corriger, je préfère repartir de zéro pour te proposer quelque chose qui fonctionne plus ou moins comme tu t'y attendais.
Ton code me paraissait trop compliqué pour le corriger, je préfère repartir de zéro pour te proposer quelque chose qui fonctionne plus ou moins comme tu t'y attendais.
package AssaneCauchemar; import java.awt.*; import javax.swing.*; public class Demarrage { public static void main(String[] args) { TestLevel dessin = new TestLevel((g, t) -> { g.setColor(Color.RED); g.drawLine(0, 0, (int) (t / 100_000_000), 0); }); JButton bouton = new JButton("start"); bouton.addActionListener(e -> dessin.start()); JFrame fenetre = new JFrame(); fenetre.add(bouton, BorderLayout.NORTH); fenetre.add(dessin, BorderLayout.CENTER); fenetre.pack(); fenetre.setLocationRelativeTo(null); fenetre.setVisible(true); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
package AssaneCauchemar; import java.awt.*; import java.util.concurrent.*; import java.util.function.BiConsumer; public class TestLevel extends Component { private final BiConsumer<Graphics2D, Long> instructions; private long zeroNanoTime; private ScheduledFuture<?> task; public TestLevel(BiConsumer<Graphics2D, Long> instructions) { this.instructions = instructions; } @Override public void paint(Graphics g) { if (task != null) { instructions.accept((Graphics2D) g, System.nanoTime() - zeroNanoTime); } } public void start() { task = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(this::repaint, 0, 100, TimeUnit.MILLISECONDS); zeroNanoTime = System.nanoTime(); } }