Olá pessoal, dificilmente eu posto uma dúvida num fórum pois geralmente encontro a resposta em tópicos dos proprios foruns na net porem isso não estou achando por nada e as soluções q encontrei não deram certo.
Bom vamos lah…
Tenho uma tabela que tem 2 linhas sendo q a primeira eh uma célula normal de texto e a segunda linha é composta por jcheckbox.
Mas o máximo q consegui até agora eh colocar os checkboxes porem qdo clico neles a celula entra em modo edição e o checkbox some aparecendo as Strings true ou false. Sei q isso tem a ver com o retorno do metodo getColumnClass do model da tabela porem esse metodo só recebe por parametro a coluna então nao tem como eu saber qual linha está pra mim retornar Boolean pra ela.
Se alguem puder me ajudar postarei aqui o model, renderer e editor da tabela:
class MyModel extends AbstractTableModel {
private String[] columnNames = {
"Tipo", "250", "500", "1000", "2000", "3000", "4000", "6000", "8000"
};
private Object[][] data = {
{"Texto:", null, null, null, null, null, null, null, null},
{"CheckBox:", new Boolean(true), new Boolean(true), new Boolean(true), new Boolean(true),
new Boolean(true), new Boolean(true), new Boolean(true), new Boolean(true)
}
};
@Override
public boolean isCellEditable(int row, int column) {
if (column > 0) {
return true;
}
return false;
}
//aqui eu teria q achar um meio de retornar Boolean.class pra segunda linha da tabela
@Override
public Class<?> getColumnClass(int columnIndex) {
return Object.class;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
public class MyCellEditor extends AbstractCellEditor implements TableCellEditor{
private final static int TEXTFIELD = 1;
private final static int CHECKBOX = 2;
private JTextField textField;
private JCheckBox checkBox;
private int swith = 0;
public MyCellEditor() {
textField = new JTextField();
textField.setBorder(null);
checkBox = new JCheckBox("", false);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value != null) {
if (value instanceof Boolean) {
swith = CHECKBOX;
checkBox.setSelected((Boolean) value);
return checkBox;
} else {
swith = TEXTFIELD;
textField.setText(value.toString());
return textField;
}
} else {
swith = 0;
textField.setText("");
return textField;
}
}
//esse metodo como não recebe por parametro a linha da tabela tive q fazer uma gambiarra pra poder retornar um valor boolean pra qdo estivesse em um célula com checkbox, com certeza deve ter alguma maneira melhor de fazer isso...
public Object getCellEditorValue() {
if(swith==TEXTFIELD){
return textField.getText();
}
if(swith==CHECKBOX){
return (Boolean) checkBox.isSelected();
}
return null;
}
}
class MyRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value instanceof Boolean) {
return table.getDefaultRenderer(Boolean.class).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
} else {
return this;
}
}
@Override
public void validate() {
super.validate();
}
@Override
public void revalidate() {
super.revalidate();
}
@Override
protected void firePropertyChange(String propertyName,
Object oldValue, Object newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
@Override
public void firePropertyChange(String propertyName,
boolean oldValue, boolean newValue) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
Desde ja agradeço a atençã de vcs…