Signaler

WindowsBuilder swing java [Résolu]

Posez votre question Streamooc 14Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention - Dernière réponse le 18 juin 2017 à 01:30 par Streamooc
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 
Utile
+0
plus moins
Bonjour,

Et quel est ton problème ? Ta question ?
KX 14682Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 15 août 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++;
    }
}
Répondre
Streamooc 14Messages 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
Répondre
Streamooc 14Messages postés samedi 17 juin 2017Date d'inscription 11 juillet 2017 Dernière intervention - 18 juin 2017 à 01:30
Merci beaucoup KX ça marche
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !