Bouton parcourir

Résolu/Fermé
aurel_kb Messages postés 28 Date d'inscription samedi 9 août 2008 Statut Membre Dernière intervention 9 juin 2014 - 17 déc. 2012 à 15:22
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 19 déc. 2012 à 13:20
Bonjour,
j'ai un bouton parcourir sur ma fenêtre java, ainsi qu'un Jpanel afin d'aficher l'image obtenu grace au bouton. j'affiche la boite de dialogue de parcour, recupere bien le chemin du fichier image, mais j'arrive pas à l'afficher sur mon panel.

btnParcourir = new JButton("Parcourir...");

btnParcourir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {

//Create a file chooser
final JFileChooser fc = new JFileChooser();
//int returnVal = fc.showOpenDialog(btnParcourir);
int returnVal = fc.showDialog(btnParcourir,"Attach");

if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
//This is where a real application would open the file.
String chemin = fc.getSelectedFile().getAbsolutePath().toString();
System.out.println(chemin);

try {
img = ImageIO.read(new File(chemin));
panImg.add(img);

} catch (IOException e) {
e.printStackTrace();
}
//log.append("Opening: " + file.getName() + "." + newline);

} else {
//log.append("Open command cancelled by user." + newline);
}

}
});

Aussi comment sauvegarde cette image si je clique sur un autre bouton Save par exemple.
Merci pour votre aide.
;) ;)

3 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
17 déc. 2012 à 15:34
En fait ton problème est surtout de savoir comment dessiner ton image dans ton JPanel, mais au niveau de ton bouton parcourir tu dis toi même que ça fonctionne. Donc regarde : Ajouter une image dans un GridLayout, Aide charger image avec java, voire Dessiner plusieurs graphes dans une interface
0
aurel_kb Messages postés 28 Date d'inscription samedi 9 août 2008 Statut Membre Dernière intervention 9 juin 2014 2
17 déc. 2012 à 22:44
Toujours bloqué j'ai essayé d'adapter à mon code sans succès.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
17 déc. 2012 à 22:55
Avec le premier lien que j'ai donné (Ajouter une image dans un GridLayout) tu peux faire :

try {
img = ImageIO.read(new File(chemin));
panImg.add(new ImageComponent(img));
}

Avec le deuxième lien que j'ai donné (Aide charger image avec java) tu peux faire :

try {
panImg.add(new ImagePanel(chemin));
}

Le troisième lien est un peu différent, mais tout dépend ce que tu veux faire...

Si cela ne suffit pas, donne nous ton code complet pour voir pourquoi tu ne peux pas adapter les liens proposés à ton code...
0
aurel_kb Messages postés 28 Date d'inscription samedi 9 août 2008 Statut Membre Dernière intervention 9 juin 2014 2
18 déc. 2012 à 10:29
Code classe principal

import java.awt.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Logger;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;



public class fich implements ActionListener{

private JFrame frame;
private JPanel pan;
private JTextField TxtRef;
private JTextField TxtNom;
private JTextField TxtPrix;
private JButton btnAnnuler;
private JButton btnValider;
private JButton btnSupprimer;
private JButton btnParcourir;
private JTextArea TxtDesc;
private String pathImage;
private Image img;
private JPanel panImg;

//JTextArea log;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
fich window = new fich();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public fich() {
initialize();
}

/**
* Initialize the contents of the frame.
*/
//@SuppressWarnings("deprecation")
private void initialize() {
frame = new JFrame();
//Définit un titre pour notre fenêtre
frame.setTitle("Ajout d'un bien immobilier");
//Définit sa taille : 400 pixels de large et 100 pixels de haut
frame.setBounds(100, 100, 553, 350);
//Nous demandons maintenant à notre objet de se positionner au centre
frame.setLocationRelativeTo(null);
//Termine le processus lorsqu'on clique sur la croix rouge
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//Garder la fenêtre en premier plan
frame.setAlwaysOnTop(true);
//Ne pas redimentionner la fenêtre
frame.setResizable(false);


//design du panel pan global
pan = new JPanel();
pan.setBackground(Color.GRAY);
pan.setLayout(null);

//design du panel top
JPanel ptop = new JPanel();
//ptop.setBackground(Color.LIGHT_GRAY);
ptop.setBounds(5, 6, 539, 262);
pan.add(ptop);
ptop.setLayout(null);

//Création des champs du formulaire
JLabel lblRef = new JLabel("Référence :");
lblRef.setBounds(8, 17, 75, 14);
ptop.add(lblRef);

JLabel lblNom = new JLabel("Nom :");
lblNom.setBounds(9, 47, 46, 14);
ptop.add(lblNom);

JLabel lblDescription = new JLabel("Description :");
lblDescription.setBounds(8, 120, 75, 14);
ptop.add(lblDescription);

TxtRef = new JTextField();
TxtRef.setBounds(170, 11, 86, 20);
ptop.add(TxtRef);

TxtNom = new JTextField();
TxtNom.setBounds(170, 41, 123, 20);
ptop.add(TxtNom);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(8, 145, 285, 102);
ptop.add(scrollPane);

TxtDesc = new JTextArea();
scrollPane.setViewportView(TxtDesc);

JLabel lblAjouterSiPossible = new JLabel("Ajouter si possible une image");
lblAjouterSiPossible.setBounds(334, 34, 195, 14);
ptop.add(lblAjouterSiPossible);

panImg = new JPanel();
//panImg.setBackground(Color.LIGHT_GRAY);
panImg.setBounds(324, 53, 205, 162);
ptop.add(panImg);

btnParcourir = new JButton("Parcourir...");

btnParcourir.addActionListener(this);
btnParcourir.setBounds(324, 224, 106, 23);
ptop.add(btnParcourir);

btnSupprimer = new JButton("Supprimer");
btnSupprimer.setBounds(433, 224, 96, 23);
ptop.add(btnSupprimer);

TxtPrix = new JTextField();
TxtPrix.setBounds(169, 72, 123, 20);
ptop.add(TxtPrix);
TxtPrix.setColumns(10);

JLabel lblPrixDuBien = new JLabel("Prix du bien :");
lblPrixDuBien.setBounds(8, 78, 120, 14);
ptop.add(lblPrixDuBien);

//design du panel droit pour les boutons
JPanel pbottom = new JPanel();
pbottom.setBounds(5, 270, 539, 43);
pan.add(pbottom);
pbottom.setLayout(null);

btnAnnuler = new JButton("Annuler");
//Fermeture de la fenêtre
btnAnnuler.addActionListener(this);
btnAnnuler.setBounds(268, 11, 89, 23);
pbottom.add(btnAnnuler);

btnValider = new JButton("Valider");
btnValider.addActionListener(this);
btnValider.setBounds(169, 11, 89, 23);
pbottom.add(btnValider);


//Et enfin ajout du panel pan,et rendre visible la frame
frame.setContentPane(pan);
//frame.show();
frame.setVisible(true);
}

//Parcours du bouton pour ajouter une image
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()== btnParcourir){

//Create a file chooser
final JFileChooser fc = new JFileChooser();
//int returnVal = fc.showOpenDialog(btnParcourir);


int returnVal = fc.showDialog(btnParcourir,"Attach");

if (returnVal == JFileChooser.APPROVE_OPTION) {
//File file = fc.getSelectedFile();
//This is where a real application would open the file.
String chemin = fc.getSelectedFile().getAbsolutePath().toString();
System.out.println(chemin);

try {

img = ImageIO.read(new File(chemin));
//img = ImageIO.read(new File("D:/COURs/932-1079-1082529-a.jpg"));
panImg.add(new ImageComponent(img));
//ImagePanel panel = new ImagePanel(new ImageIcon("D:/COURs/932-1079-1082529-a.jpg").getImage());
//panImg.add(panel);
panImg.repaint();

} catch (IOException ex) {
ex.printStackTrace();
}



System.out.println("Chargement ok");

} else {
System.out.println("impossible de charger l'image");
}

}
}

/*public void paintComponent(Graphics g){
if(img!=null){
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(img, 0, 0, panImg.getWidth(), panImg.getHeight(), null);
}
} */

}

Classe ImageComponent si c'est elle que j'utilise

public class ImageComponent extends Component {

private static final long serialVersionUID = 1;

private final java.awt.Image img;

public ImageComponent(java.awt.Image image)
{
img = image;
}

@Override
public void paint(java.awt.Graphics g)
{
g.drawImage(img, 0, 0, getWidth(), getHeight(), null, null);
}

}

classe ImagePanel si c'est elle que j'utilise

public class ImagePanel extends Component {

private static final long serialVersionUID = 1;

private final BufferedImage img;

ImagePanel(String fileName) throws IOException
{
img = ImageIO.read(new File(fileName));
}

public void paintComponent(Graphics g)
{
//super.paintComponent(g);
g.drawImage(img,0,0,null);
}

}

J'ai testé avec les deux mais rien ne s'affiche dans le panel. Je ne sais pas si c'est probleme avec le chemin de l'image, ou j'appel mal les classe. Ou est ce qu'on utilise vraiment la procedure PaintComponent?
Thank KX et Dan pour vos reponses précedentes.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
18 déc. 2012 à 11:12
"Ou est ce qu'on utilise vraiment la procedure PaintComponent?"
Ici nul part, car tu as modifié mon code, ImagePanel étandait la classe JPanel (pour lequel paintComponent est appelé automatiquement) et tu l'as modifié pour étendre Component (où paintComponent n'est pas appelé)

Mais le problème n'est pas là, car ça bug aussi avec ImageComponent, ou même n'importe quel autre composant (un JButton par exemple), rien de ce que tu ajoutes dans ton panImg n'est pris en compte lorsque tu fais le add dans ton actionPerformed !

J'avoue que pour l'instant je sèche, je vais regarder si en codant ton programme correctement j'arrive à enlever le bug (par contre pas sûr que j'en trouve l'explication...)
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
18 déc. 2012 à 12:28
Bon alors, il s'agit en fait de deux problèmes :

1) Quand on ajoutes des composants à un JPanel dans l'actionListener, il faut ensuite appeler la méthode validate().

try {

img = ImageIO.read(new File(chemin));
//img = ImageIO.read(new File("D:/COURs/932-1079-1082529-a.jpg"));
panImg.add(new ImageComponent(img));
//ImagePanel panel = new ImagePanel(new ImageIcon("D:/COURs/932-1079-1082529-a.jpg").getImage());
//panImg.add(panel);
panImg.validate(); // Important !

} catch (IOException ex) {
ex.printStackTrace();
}

2) Mes classes d'images fonctionnent bien avec des GridLayout, mais avec les autres Layout ça bug (car le Component n'a pas de taille) donc il suffirait d'éditer le Layout du panImg pour que ça fonctionne.

panImg = new JPanel();
//panImg.setBackground(Color.LIGHT_GRAY);
panImg.setLayout(new GridLayout(1,1));  // Important !
panImg.setBounds(324, 53, 205, 162);
ptop.add(panImg);

Remarque : pour trouver ça j'ai du remettre un peu d'ordre dans ton code, autant en profiter :

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Fiche extends JFrame
{
    private static final long serialVersionUID = 1;
    
    public static void main(String[] args)
    {
        new Fiche();
    }

public Fiche()
{
    // ---------------------------------------
    // ptop
    // ---------------------------------------
    
    final JPanel ptop = new JPanel();
    ptop.setLayout(null);
    ptop.setBounds(5, 6, 539, 262);
    
    final JLabel lblRef = new JLabel("Référence :");
    lblRef.setBounds(8, 17, 75, 14);
    ptop.add(lblRef);
    
    final JLabel lblNom = new JLabel("Nom :");
    lblNom.setBounds(9, 47, 46, 14);
    ptop.add(lblNom);
    
    final JLabel lblDescription = new JLabel("Description :");
    lblDescription.setBounds(8, 120, 75, 14);
    ptop.add(lblDescription);
    
    final JTextField TxtRef = new JTextField();
    TxtRef.setBounds(170, 11, 86, 20);
    ptop.add(TxtRef);
    
    final JTextField TxtNom = new JTextField();
    TxtNom.setBounds(170, 41, 123, 20);
    ptop.add(TxtNom);
        
    final JTextArea TxtDesc = new JTextArea();
    final JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(8, 145, 285, 102);
    scrollPane.setViewportView(TxtDesc);
    ptop.add(scrollPane);
    
    final JLabel lblAjouterSiPossible = new JLabel("Ajouter si possible une image");
    lblAjouterSiPossible.setBounds(334, 34, 195, 14);
    ptop.add(lblAjouterSiPossible);
    
    final JPanel panImg = new JPanel();
    panImg.setBounds(324, 53, 205, 162);
    panImg.setLayout(new GridLayout(1,1));
    ptop.add(panImg);
    
    final JFileChooser fc = new JFileChooser();
    
    final JButton btnParcourir = new JButton("Parcourir...");
    btnParcourir.setBounds(324, 224, 106, 23);
    btnParcourir.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            if (fc.showDialog(Fiche.this,"Attach") == JFileChooser.APPROVE_OPTION)
            {
                // redimensionnement du GridLayout (facultatif)
                int n = (int) Math.round(Math.sqrt(panImg.getComponentCount()+1));
                panImg.setLayout(new GridLayout(n,n));
                
                String chemin = fc.getSelectedFile().getAbsolutePath();
                Image img = new ImageIcon(chemin).getImage();
                panImg.add(new ImageComponent(img));
                panImg.validate();                
            }
        }
    });
    ptop.add(btnParcourir);
        
    final JButton btnSupprimer = new JButton("Supprimer");
    btnSupprimer.setBounds(433, 224, 96, 23);
    ptop.add(btnSupprimer);

    final JTextField TxtPrix = new JTextField();
    TxtPrix.setBounds(169, 72, 123, 20);
    TxtPrix.setColumns(10);
    ptop.add(TxtPrix);
    
    final JLabel lblPrixDuBien = new JLabel("Prix du bien :");
    lblPrixDuBien.setBounds(8, 78, 120, 14);
    ptop.add(lblPrixDuBien);

    // ---------------------------------------
    // pbottom
    // ---------------------------------------
    
    final JPanel pbottom = new JPanel();
    pbottom.setBounds(5, 270, 539, 43);
    pbottom.setLayout(null);

    final JButton btnAnnuler = new JButton("Annuler");
    btnAnnuler.setBounds(268, 11, 89, 23);
    btnAnnuler.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Annuler");
        }        
    });
    pbottom.add(btnAnnuler);

    final JButton btnValider = new JButton("Valider");
    btnValider.setBounds(169, 11, 89, 23);    
    btnValider.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Valider");
        }        
    });
    pbottom.add(btnValider);

    // ---------------------------------------
    // JFrame
    // ---------------------------------------
    
    setTitle("Ajout d'un bien immobilier");
    setBounds(100, 100, 553, 350);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setAlwaysOnTop(true);
    setResizable(false);        
    setBackground(Color.GRAY);
    setLayout(null);
    
    add(ptop);
    add(pbottom);
    
    setVisible(true);
}
}
0
aurel_kb Messages postés 28 Date d'inscription samedi 9 août 2008 Statut Membre Dernière intervention 9 juin 2014 2
18 déc. 2012 à 17:41
Super KX ca marche nicke Thank you!!!
Et si je veux save cette image qui est sur le panel a tu une idée?
Merci encore.
0