io uso una classe apposta che identifica il bottone..
codice:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
public class ButtomColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, Globals{
JTable table;
JButton renderButton;
JButton editButton;
String text;
public ButtomColumn(JTable table, int column){
super();
this.table = table;
renderButton = getJButton();
editButton = getJButton();
editButton.setFocusPainted( false );
editButton.addActionListener( this );
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(column).setCellRenderer( this );
columnModel.getColumn(column).setCellEditor( this );
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
if(value == null){
renderButton.setText("");
}else{
renderButton.setText(value.toString());
}
// il metodo restituisce un panel per evitare il ridimensionamento del jButton
JPanel jPanel = new JPanel();
jPanel.setBackground(table.getBackground());
jPanel.setLayout(new GridBagLayout());
jPanel.add(renderButton, new GridBagConstraints());
jPanel.add(renderButton);
return jPanel;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){
if(value==null){
text = "";
}else{
text = value.toString();
}
editButton.setText( text );
return editButton;
}
public Object getCellEditorValue(){
return text;
}
public void actionPerformed(ActionEvent e){
fireEditingStopped();
System.out.println( e.getActionCommand() + " : " + table.getSelectedRow());
}
private javax.swing.JButton getJButton() {
JButton jButton = new JButton();
jButton.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
jButton.setPreferredSize(new Dimension(30, 28));
jButton.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 12));
jButton.setIcon(new ImageIcon(getClass().getResource(Globals.IMG_CONSOLE_APRI_PDF)));
return jButton;
}
}
e alla table specifico che la colonna n appartiene alla classe appena riportata :
codice:
public javax.swing.JTable getJTable() {
// PREPARO INTESTAZIONI TABELLA
String[] columnNames = {"Sel", "Prog", "Num. Ordine", "Data Ordine", "Nome File", "Stato", "Cod Cliente", "Descr Cliente", "", "Pdf"};
model = new PersonalTableModel(lista, columnNames);
table = new JTable(model);
table.getTableHeader().setReorderingAllowed( false );
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setPreferredScrollableViewportSize(new Dimension(780,326));
// colonne personalizzate
new ImageColumn(table,8);
new ButtomColum(table,9);
// colonne nascoste
table.removeColumn(table.getColumnModel().getColumn(4));
table.removeColumn(table.getColumnModel().getColumn(4));
table.removeColumn(table.getColumnModel().getColumn(4));
// colonne ridimensionate
table.setRowHeight(30);
table.getColumn("Sel").setPreferredWidth(35);
table.getColumn("Prog").setPreferredWidth(65);
table.getColumn("Num. Ordine").setPreferredWidth(140);
table.getColumn("Data Ordine").setPreferredWidth(120);
table.getColumn("Descr Cliente").setPreferredWidth(380);
table.getColumn("Pdf").setPreferredWidth(60);
table.getColumn("").setPreferredWidth(35);
return table;
}