WindowsBuilder swing java

Résolu/Fermé
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - Modifié le 17 juin 2017 à 09:45
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - 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();

           }

         }

       }  
 

}
A voir également:

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
17 juin 2017 à 09:48
Bonjour,

Et quel est ton problème ? Ta question ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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++;
    }
}
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
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
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
18 juin 2017 à 01:30
Merci beaucoup KX ça marche
0