JTable- clic sur image

Résolu
thassa Messages postés 19 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 21 février 2008 - 21 févr. 2008 à 10:00
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 25 févr. 2008 à 11:02
bonjour,
Le code ci-dessous affiche un tableau contenant des images.
le problème est que si je clique pour la premiere fois sur l'image pour afficher une nouvelle fenêtre,l'image se décale seulement et c'est lorsque je clique pour la deuxieme fois que la fenêtre s'affiche.
Mon but est d'afficher la fenêtre dès le premier clic sur l'image sans qu'elle soit décalée.
(j'utilise swing + eclipse)

import java.awt.event.*;
import javax.swing.AbstractCellEditor;
import javax.swing.table.TableCellEditor;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class Ess4 extends JFrame {

    protected ImageIcon createImageIcon(String path, String description)
    {
            java.net.URL imgURL = getClass().getResource(path);
            if (imgURL != null)
            {
                return new ImageIcon(imgURL, description);
            } else
            {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
    }
 
public Ess4() {
 
    JTable table = new JTable(new MonModele());
  
 table.getColumn("image").setCellRenderer(new ImageRendererr());
 table.getColumn("image").setCellEditor(new ImageEditorr());
 
    JScrollPane scroll = new JScrollPane(table);
    getContentPane().add(scroll);
    setSize(400, 100);
    setVisible(true);
  }
//definition du modele
  class MonModele extends AbstractTableModel
{  
      ImageIcon im1=createImageIcon("images/montre.jpg","montre");
      ImageIcon im2=createImageIcon("images/montre.jpg","montre");

        String columnNames[]={ "image", "String" };
        Object[][] data={ { im1, "foo" },{ im2, "bar" } };
    
       public int getColumnCount() {
           return columnNames.length;
       }

       public int getRowCount() {
           return data.length;
       }

       public String getColumnName(int col) {
           return columnNames[col];
       }

       public Object getValueAt(int row, int col) {
           return data[row][col];
       }

       public Class getColumnClass(int c) {
           return getValueAt(0, c).getClass();
       }

       public boolean isCellEditable(int row, int col) { 
               return true;
       }
  } //Fin MonModele
 
  public static void main(String[] args) {
 
    Ess4 frame = new Ess4();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }
}
//fin Ess4

//definition du renderer pour afficher l image dans un JLabel
class ImageRendererr implements TableCellRenderer {

  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
      ImageIcon i=(ImageIcon)value;
  JLabel label=new JLabel(i);
    return label;
  }
}// fin ImageRendererr

//definition du Editor pour traiter l évènement de clic
class ImageEditorr extends AbstractCellEditor implements TableCellEditor {
  protected JLabel labelImage;
  ImageIcon i;
  private boolean isPushed;

  public ImageEditorr() {
      labelImage = new JLabel();
      labelImage.setOpaque(true);
      labelImage.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
          System.err.println("clic");
          fireEditingStopped();
       
      }
    });
  }

  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) {
 
    i=(ImageIcon)value;
      labelImage.setIcon(i);
    isPushed = true;
    return labelImage;
  }

  public Object getCellEditorValue() {
    if (isPushed) {
      JFrame f=new JFrame("bon!");
      f.pack();
      f.setVisible(true);
    }
    isPushed = false;
    return i;
  }

 public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
  }

  protected void fireEditingStopped() {
    super.fireEditingStopped();
  }
}//fin ImageEditorr

quelqu'un aura-t-il une idée?
merci

1 réponse

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 févr. 2008 à 11:02
Enlève le CellEditor et ajoute un MouseListener à la JTable:

    private JTable table;
...
    public Ess4() {

        table = new JTable(new MonModele());
        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                int row = table.getSelectedRow();
                int column = table.getSelectedColumn();
                if (column == 0) {
                    System.out.println("mouseClicked row: " + row + "  column: " + column);
                    JFrame f = new JFrame("bon!");
                    f.pack();
                    f.setVisible(true);
                }
            }
        });
        table.getColumn("image").setCellRenderer(new ImageRendererr());

        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);
        setSize(400, 100);
        setVisible(true);
    }
3