Ecco lo screenshot di quello che voglio fare:Fare un cliccabile JButton all'interno di una JTable
Quello che sta succedendo c'è il JButton mostra correttamente, ma non succede nulla quando faccio clic su di esso. Dopo qualche ricerca, ho scoperto che il Object
restituito da table.getValueAt()
è una stringa invece di un JButton ...
Ecco il codice:
tblResult = new JTable(data,cols) {
public TableCellRenderer getCellRenderer(int row, int column) {
return new ClientsTableRenderer();
}
};
Io lo uso per la compilazione a run-time la JTable: (tblResult
è ora 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));
}}
);
Qui la ClientsTableRenderer
classe
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;
}
}
E finalmente, il 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();
}
}
}
}
Sono gentilmente nuovo a Java, l'aiuto sarebbe molto apprezzato :)
Grazie in anticipo!
value.getClass()? Restituisce anche "java.lang.String" – noli
CellRenderer è usato solo per "dipingere" la tabella, non sono impostati come "Componenti live". getValueAt restituisce un valore di TableModel, non un componente, quindi probabilmente restituirà "Consulter" –
Questo è quello che pensavo. Tuttavia, c'è un modo per risolverlo? – noli