Rafraîchissement événement dans un JFrame

Fermé
lallana2re Messages postés 19 Date d'inscription lundi 2 avril 2018 Statut Membre Dernière intervention 6 novembre 2020 - Modifié le 30 août 2018 à 22:47
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 31 août 2018 à 14:41
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 :
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.

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 août 2018 à 14:41
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.

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();
    }
}
0