Actions en swing

Fermé
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - Modifié le 22 janv. 2018 à 13:21
Bonjour,
Salut à tous;
Dans ma classe FenetrePrincipale j'ai créé un bouton 'run' et un combiné téléphonique 'demandeur'.
La classe FilDecrochage permet de dessiner un fil long.
Le problème que je rencontre c'est que lorsque je clique sur le bouton 'run' lorsque le fil défile il y a une duplication du bouton 'run' et et de 'demandeur';le fil en se déplaçant déplace avec lui tout ce qui se trouve dans la fenetre.
J'ai essayé las si quelqu'un peut m'aider s'il vous plait
voici mon code:
 public class FenetrePrincipale extends JFrame {
                               //implements ComponentListener,ItemListener{

 private static final long serialVersionUID = 1L;
 

    public FenetrePrincipale() {
        setSize(1364, 788);
        setLocationByPlatform(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

         JPanel panel = new JPanel(); 
        panel.setLayout(null);
        
        FilDecrochage fil = new FilDecrochage(70, 120);
        fil.setLocation(-51, -43);
        fil.setSize(436,232);
      panel.add(fil); 

        //Ajout de tout le contenu au conteneur
       getContentPane().add(panel,BorderLayout.CENTER);
      
       //Boutons et images
       
        //Le bouton 'run'
        JButton buttonRun = new JButton("");
        buttonRun.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/sn/esmt/logicieltap/ressources/run.png.png")));
        buttonRun.setBounds(46, 658, 56, 35);
        panel.add(buttonRun);        

        
        JToggleButton toggleButton = new JToggleButton("");
        toggleButton.setIcon(new ImageIcon(FenetrePrincipale.class.getResource("/sn/esmt/logicieltap/ressources/demandeur.png")));
        toggleButton.setBounds(46, 78, 127, 111);
        panel.add(toggleButton);

        //Utilisation uniquement du bouton 'boutonRun'
          
        buttonRun.addActionListener(new WorkflowActionListener(0, (state,e)->{
      switch (state) {
      case 0:
          
       go(fil);

           return 1;             
             
         default:
             throw new IllegalStateException("State invalid: " + state);
  }
     }));  
    }
   
    private void go(FilDecrochage fil) {
     new SwingWorker<Void, Void>() {
                @Override
            protected Void doInBackground() {
                 for(int i = 0; i <400; i++){

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

                        x++;

                        //y++;

                        fil.setPosX(x);

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

                  fil.setVisible(true);  //on voit le fil rouge défiler quand on appuie sur le bouton 'run'
                       sleep(20);
                      
                   
                }
                return null;
            }
        }.execute();
     
    }
      private static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
      
}

public class FilDecrochage extends JPanel{
 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.blue);
      g.fillRect(posX, posY, 20, 20);
  }
  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 WorkflowActionListener implements ActionListener{

 private int state;
    private final BiFunction<Integer, ActionEvent, Integer> actionsPerformed;

    public WorkflowActionListener(int init, BiFunction<Integer, ActionEvent, Integer> actionsPerformed) {
        state = init;
        this.actionsPerformed = actionsPerformed;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        state = actionsPerformed.apply(state, e);
    }

}