WindowsBuilder swing java [Résolu]

Streamooc 14 Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention - 17 juin 2017 à 09:39 - Dernière réponse : Streamooc 14 Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention
- 18 juin 2017 à 01:30
bonjour je suis nouveau en swing java et je rencontre un problème majeur si quelqu'un pourrait m'aider.Le but de mon programme est de permettre à l'utilsateur une fois en cliquant sur le bouton 'run' de déclencher le défilement d'un fil rouge.Je vous présente les deux classes que j'ai créées.'FilDecrochage' qui permet de dessiner le fil et la classe principale dans laquelle j'ai mis ActionListener sur le bouton run.La méthode 'go' permet de déclencher le fil.
public class FilDecrochage extends JPanel{
 public FilDecrochage() {
 }
 
 //Partie 1:fil rouge
 private int posX = 20;

   private int posY = -20;


   @Override
   public void paintComponent(Graphics g){

     g.setColor(Color.red);

     g.fillRect(posX, posY, 50, 50);

   }


   public int getPosX() {

     return posX;

   }


   public void setPosX(int posX) {

     this.posX = posX;

   }


   public int getPosY() {

     return posY;

   }


   public void setPosY(int posY) {

     this.posY = posY;

   }

  
}

public class ClassePrincipale extends JFrame {

 private JPanel contentPane;
 private FilDecrochage pan=new FilDecrochage();

 /**


* Launch the application.

*/
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     ClassePrincipale frame = new ClassePrincipale();
     frame.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }

 /**


* Create the frame.

*/
 public ClassePrincipale() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(100, 100, 450, 300);
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  contentPane.setLayout(new BorderLayout(0, 0));
  setContentPane(contentPane);
  
  JToggleButton toggleButton = new JToggleButton("");
  toggleButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {
   go();
 
   
   }

   
   

   
  });
  toggleButton.setIcon(new ImageIcon(ClassePrincipale.class.getResource("/tapwindowsbuilder/ressources/run.png.png")));
  contentPane.add(toggleButton, BorderLayout.CENTER);
 }
 private void go() {
  // TODO Auto-generated method stub
  
    
      for(int i = -50; i < pan.getWidth(); i++){

           int x = pan.getPosX(), y = pan.getPosY();

           x++;

           y++;

           pan.setPosX(x);

           pan.setPosY(y);

           pan.repaint();     //pan.repaint(). Elle demande à votre composant, ici un JPanel, de se redessiner.

           try {

             Thread.sleep(10);    ///Mise en attente du programme pendant un laps de temps défini dans la méthode sleep() exprimé en millièmes de seconde

           } catch (InterruptedException e) {

             e.printStackTrace();

           }

         }

       }  
 

}
Afficher la suite 

4 réponses

Répondre au sujet
KX 15101 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 décembre 2017 Dernière intervention - 17 juin 2017 à 09:48
0
Utile
3
Bonjour,

Et quel est ton problème ? Ta question ?
KX 15101 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 décembre 2017 Dernière intervention - 17 juin 2017 à 10:31
Ci-dessous ton code revu et corrigé, avec notamment un SwingWorker dans ta méthode go() pour permettre l'affichage en arrière plan de l'animation, sinon tu ne verrais que l'affichage à la fin de l'ActionListener (pas d'affichage intermédiaire) car le repaint() serait ignoré, l'EDT étant monopolisé par l'ActionListener...

import java.awt.*;
import javax.swing.*;

public class ClassePrincipale {

    public static void main(String[] args) {
        new FenetrePrincipale().setVisible(true);
    }
}

class FenetrePrincipale extends JFrame {

    private static final long serialVersionUID = 1L;

    public FenetrePrincipale() {
        setSize(500, 300);
        setLocationByPlatform(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        FilDecrochage fil = new FilDecrochage(0, 0);
        add(fil, BorderLayout.CENTER);

        JButton button = new JButton("Run");
        button.addActionListener(e -> go(fil));
        add(button, BorderLayout.SOUTH);
    }

    private void go(FilDecrochage fil) {
        new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() {
                for (int i = 0; i < 30; i++) {
                    fil.incrX();
                    fil.incrY();
                    fil.repaint();
                    sleep(10);
                }
                return null;
            }
        }.execute();
    }

    private static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class FilDecrochage extends Component {

    private static final long serialVersionUID = 1L;

    private int posX;
    private int posY;

    public FilDecrochage(int posX, int posY) {
        this.posX = posX;
        this.posY = posY;
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(posX, posY, 50, 50);
    }

    public void incrX() {
        posX++;
    }

    public void incrY() {
        posY++;
    }
}
Streamooc 14 Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention - 17 juin 2017 à 12:42
Merci pour la correction apportée.Le problème que j'avais est que rien ne s'affichait quand je clique sur le bouton 'run'.Je vais essayer avec ta correction et te rendre compte.Merci beaucoup
Streamooc 14 Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention - 18 juin 2017 à 01:30
Merci beaucoup KX ça marche
Commenter la réponse de KX