Streamooc
Messages postés79Date d'inscriptionsamedi 17 juin 2017StatutMembreDerniè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);
}
}