Voici la capture d'écran de ce que je veux faire:Faire cliquable JButton dans un JTable
Qu'est-ce qui se passe, il y a la DButton montre bien, mais rien ne se passe quand je clique dessus. Après quelques recherches, j'ai trouvé que le Object
retourné par table.getValueAt()
est une chaîne au lieu d'un JButton ...
Voici le code:
tblResult = new JTable(data,cols) {
public TableCellRenderer getCellRenderer(int row, int column) {
return new ClientsTableRenderer();
}
};
J'utilise cela pour peuplant lors de l'exécution le JTable: (tblResult
est maintenant Clients.rblResult
)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DefaultTableModel aModel = new DefaultTableModel() {
//setting the jtable read only
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
String[] cols = {"N°","Société", "TVA", "CP", "Ville", ""};
aModel.setColumnIdentifiers(cols);
Object[] temp = new Object[6];
for(int i=0;i<result.length;i++) {
temp[0] = result[i].custNumber;
temp[1] = result[i].name;
temp[2] = result[i].tva;
temp[3] = result[i].cp;
temp[4] = result[i].city;
temp[5] = "Consulter";
aModel.addRow(temp);
}
Clients.tblResult.setModel(aModel);
Clients.tblResult.addMouseListener(new JTableButtonMouseListener(Clients.tblResult));
}}
);
ici, la classe ClientsTableRenderer
public class ClientsTableRenderer extends JPanel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(final JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setBackground(Color.WHITE);
if(column < 5) {
JLabel label = new JLabel(value.toString());
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,0,9));
panel.setBackground(Color.WHITE);
panel.add(label);
this.add(panel);
} else {
JButton button = new JButton(value.toString());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Clicked !");
}
});
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,0,3));
panel.setBackground(Color.WHITE);
panel.add(button);
this.add(panel);
}
return this;
}
}
Et finalement, le JTableButtonMouseListener():
public class JTableButtonMouseListener extends MouseAdapter {
private final JTable table;
public JTableButtonMouseListener(JTable table) {
this.table = table;
}
@Override public void mouseClicked(MouseEvent e) {
int column = table.getColumnModel().getColumnIndexAtX(e.getX());
int row = e.getY()/table.getRowHeight();
System.out.println("Col :"+column + "row:"+row);
if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) {
Object value = table.getValueAt(row, column);
System.out.println("Value :"+value.getClass().getName());
if (value instanceof JButton) {
((JButton)value).doClick();
}
}
}
}
Je suis gentiment nouveau à Java, aide serait très appréciée :)
Merci à l'avance!
valeur.getClass()? Il renvoie également "java.lang.String" – noli
CellRenderer sont uniquement utilisés pour "peindre" la table, ils ne sont pas définis comme "composants Live". getValueAt renvoie une valeur du TableModel, pas un composant, donc il retournera probablement "Consulter" –
C'est ce que je pensais. Cependant, y a-t-il un moyen de le réparer? – noli