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