Ajouter/ changer image sur évènement - Swing

Signaler
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
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

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
et j'oubliais, dans le constructeur, ajoute cette ligne :

this.addActionListener(this);
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

merci de ta réponse rapide
par contre il n'a pas l'air de connaitre cette ligne :

this.addActionListener(this);
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Quand est ce que tu veux ajouter ton label dans le panel courant ?
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

C'est ca le problème je n'ai pas de JButton l’évènement provient du Timer t
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

du coup j' ai fais
t.addActionListener(this);
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

mais toujours rien (dsl pour le double message)
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Si tu veux montre moi le code de ton timer, je te dirai comment le placer
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

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();
}
};
}
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
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);
      }
   } 
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Si ca ne marche pas, dis le moi et j'importerai ton projet dans Eclipse pour tester et te trouver une solution
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Alors ca marche ?
Messages postés
55
Date d'inscription
mercredi 3 janvier 2007
Statut
Membre
Dernière intervention
21 février 2012

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 !
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
363
Alors parfait, peux tu accepter les réponses qui t'on aidé.

Bon courage pour la suite.

a+