Ajouter/ changer image sur évènement - Swing

Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012 - 15 sept. 2011 à 14:00
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 25 sept. 2011 à 12:07
Bonjour tout le monde,

Voila j'e débute avec le Swing et j'ai besoin de'afficher une image sur un évènement ici un Timer de 1s
le problème c'est qu'elle ne s'affiche pas...

Voici ci le code :
package Swing.EnOcean.HVAC;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.Timer;

import javax.swing.JPanel;

import knx.Listener;

public class LightLayout extends JPanel implements ActionListener{

private Listener memoKnx;
private static JLabel lab,lab1;


private static final long serialVersionUID = -9129265835866528105L;

JPanel pane = new JPanel();

public LightLayout(String title, Listener knx){
super(new FlowLayout());
setBorder(BorderFactory.createTitledBorder(title));
this.memoKnx = knx;
Timer t = new Timer (1000, this);
t.start();

lab = new JLabel(new ImageIcon("Light_On.png"));
lab1 = new JLabel(new ImageIcon("Light_Off.png"));

}
@Override
public void actionPerformed(ActionEvent ae) {
this.add(lab1);
}
}


Merci d'avance

16 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 14:27
Bonjour,

Essaye de remplacer le code de ton actionListener par :


	@Override
public void actionPerformed(ActionEvent ae) {
this.add(lab1);
validate();
repaint();
}


Et ca devrait marcher
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 14:29
et j'oubliais, dans le constructeur, ajoute cette ligne :

this.addActionListener(this);
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
15 sept. 2011 à 14:47
merci de ta réponse rapide
par contre il n'a pas l'air de connaitre cette ligne :

this.addActionListener(this);
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 14:57
Pardon, je t'ai dis des aneries, c'est sur le composant qui déclenche l'action qui permet d'afficher lab1 qu'il faut ajouter le listener (surement un JButton) et pas sur this
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 14:58
Quand est ce que tu veux ajouter ton label dans le panel courant ?
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
15 sept. 2011 à 14:59
C'est ca le problème je n'ai pas de JButton l’évènement provient du Timer t
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
15 sept. 2011 à 15:04
du coup j' ai fais
t.addActionListener(this);
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
15 sept. 2011 à 15:04
mais toujours rien (dsl pour le double message)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 15:41
Dans ce cas, je te conseil d'enlever le implements ActionListener, d'appeler ta méthode ajouterLab1() et de ne pas lui passer d'argument.

Pour l'appeler, appelles la directement dans le timer
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
15 sept. 2011 à 16:09
Si tu veux montre moi le code de ton timer, je te dirai comment le placer
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
15 sept. 2011 à 16:37
alors désolé je suis passé du coq à l'âne....

J'aime pas trop le fait de mettre une image dans un label...
dans j'ai trouvé d'autres source qui me le fait avec des ImageIcon
par contre quand je lance mon interface l'encadré de mon Jpanel est tout petit et mon image est du coup presque invisible...
voici les sources complet :

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.*;

public class MainFrame extends JFrame {
/**
 * 
 */
private static final long serialVersionUID = -2784991357311304465L;
// Simple Object class used to add our MainPanel to a JFrame so that it can
// be displayed without the use of an applet.
MainPanel mPanel,mPanel2;

MainFrame() {

setTitle("Ball animation");
Container content = getContentPane();
JPanel test = new JPanel(new FlowLayout());

setSize(100, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.add(new MainPanel()); // add MainPanel JPanel to JFrame


content.add(test, BorderLayout.WEST);

pack();
setVisible(true); // show class

}

public static void main(String[] args) {
new MainFrame();
}
}


//required libraries:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class MainPanel extends JPanel { // inherit JPanel
Image ballImage; // Reserve memory for Image ballImage;
int i = 0;

// Constructor:-----------------------------------------------------
public MainPanel() {
ImageIcon ball_IMG_ICON = new ImageIcon("ball.png");
ballImage = ball_IMG_ICON.getImage(); // get ImageIcon ball_IMG_ICON and
// store it in Image ballImage
prepareImage(ballImage, this);
setDoubleBuffered(true);
setBorder(BorderFactory.createTitledBorder("EnOcean"));
setSize(100,100);
new Timer(1000, paintTimer).start();
}

// ----------------------------------------------------------------

public void paint(Graphics g) {

super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(ballImage, 10, 10, this); //Draws the ball Image at the correct X and Y co-ordinates.									
Toolkit.getDefaultToolkit().sync(); // necessary for linux users to draw  and animate image correctly
g.dispose();
}

Action paintTimer = new AbstractAction() { // functionality of our timer:
public void actionPerformed(ActionEvent e) {
if ( i== 0){

ImageIcon ball_IMG_ICON = new ImageIcon("ball.png");
ballImage = ball_IMG_ICON.getImage(); // get ImageIcon ball_IMG_ICON and
// store it in Image ballImage
i++;
}
else if (i ==1){
ImageIcon ball_IMG_ICON = new ImageIcon("ball2.png");
ballImage = ball_IMG_ICON.getImage(); // get ImageIcon ball_IMG_ICON and
// store it in Image ballImage
i = 0;
}
repaint();
}
};
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
16 sept. 2011 à 08:25
Je ne sais pas trop pourquoi tu n'aimes pas trop ce principe, c'est pourtant le plus simple. Par contre, c'est vrai que ce n'est pas vraiment adapté pour faire une image de fond.

Je ne sais pas trop d'où vient ton problème, je vois deux solutions, soit ton Layout te redimmentionne le Janel et le rend minuscule. Dans ce cas là, essaye de faire un setLayout(new GridLayout(1, 0)); à la place du FlowLayout.

Soit ton image ne s'adapte pas à ta taille du JPanel, pour que ton image s'adapte automatiquement, voilà comment faire :
   @Override
   public void paintComponent(Graphics g){
      if(image!=null){
         Graphics2D g2d = (Graphics2D)g;
         g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
         g2d.drawImage(image, 0, 0, getWidth(), getHeight(), null);
      }
   } 
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
16 sept. 2011 à 08:26
Si ca ne marche pas, dis le moi et j'importerai ton projet dans Eclipse pour tester et te trouver une solution
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
24 sept. 2011 à 18:50
Alors ca marche ?
0
Nico_35136 Messages postés 55 Date d'inscription mercredi 3 janvier 2007 Statut Membre Dernière intervention 21 février 2012
24 sept. 2011 à 19:37
Désolé j'ai oublié de te répondre. Oui ça fonctionne il fallait aussi rajouter un setSize avant le repaint et tous roule merci de ton aide !
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
25 sept. 2011 à 12:07
Alors parfait, peux tu accepter les réponses qui t'on aidé.

Bon courage pour la suite.

a+
0