Rafraîchissement événement dans un JFrame
lallana2re
Messages postés
23
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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
- Impossible de changer la fréquence de rafraîchissement - Forum Matériel & Système
- Un evenement inattendu s'est produit league of legends ✓ - Forum jeux en ligne
- Problème taux de rafraîchissement ✓ - Forum Ecran
- Évènement facebook disparu ✓ - Forum Facebook
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();
}
}