Boa tarde Amigos,
Sei que deve ser coisa boba, mas to desde ontem com esse problema. Eu criei uma JTable e apliquei nela um ColumnModel, um TableModel e um CellEditor onde coloco um JCombox em algumas colunas, tudo funciona bem, eu consigo selecionar a opção do comboBox que eu quero, mas quando clico em outra célula ele muda o combo da que cliquei primeiro para o index 0, alguém sabe como posso solucionar isso?
Abçs
Marcelo Logan
Posta seu TableModel e o CellEditor do ComboBox.
Bom dia Galera,
Segue a baixo o meu Model
[code]public class DiarioClasseTableModel extends AbstractTableModel {
ArrayList<Aluno> vAlunos;
public DiarioClasseTableModel(ArrayList<Aluno> vAlunos) {
this.vAlunos = vAlunos;
}
public int getRowCount() {
return vAlunos.size();
}
public int getColumnCount() {
return vAlunos.get(0).getvAula().size() + 1;
}
public Object getValueAt(int rowIndex, int columnIndex) {
Aluno umAluno = vAlunos.get(rowIndex);
switch(columnIndex){
case 0: return umAluno.getNome();
}
return null;
}
@Override
public boolean isCellEditable(int row, int col) {
if (col == 0) { // Quais colunas eu não quero deixar editar
return false;
} else {
return true;
}
}
}[/code]
e o meu CellEditor
[code]public class DiarioClasseCellEditor extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener {
JTable table;
JComboBox renderJcb;
JComboBox editJcb;
String text;
Aula aula;
public DiarioClasseCellEditor(JTable table, int column, Aula aula) {
this.table = table;
String[] values = new String[]{"", "2 Presenças", "2 Faltas", "1 Presença e 1Falta"};
editJcb = new JComboBox(values);
renderJcb = new JComboBox(values);
editJcb.setFocusable(false);
editJcb.addActionListener(this);
this.aula = aula;
TableColumnModel tableColumn = table.getColumnModel();
tableColumn.getColumn(column).setCellRenderer(this);
tableColumn.getColumn(column).setCellEditor(this);
}
public Object getCellEditorValue() {
return text;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (hasFocus) {
renderJcb.setForeground(table.getForeground());
renderJcb.setBackground(UIManager.getColor("Button.background"));
} else if (isSelected) {
renderJcb.setForeground(table.getSelectionForeground());
renderJcb.setBackground(table.getSelectionBackground());
} else {
renderJcb.setForeground(table.getForeground());
renderJcb.setBackground(UIManager.getColor("Button.background"));
}
renderJcb.addItem((value == null) ? "" : value.toString());
return renderJcb;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
text = (value == null) ? "" : value.toString();
editJcb.addItem(text);
return editJcb;
}
public void actionPerformed(ActionEvent e) {
int coluna = table.getSelectedColumn();
int index = editJcb.getSelectedIndex();
AulaDao dao = new AulaDao();
if (index == 1) {
aula.setPresenca(2);
aula.setFalta(0);
} else if (index == 2) {
aula.setPresenca(0);
aula.setFalta(2);
} else if (index == 3) {
aula.setPresenca(1);
aula.setFalta(1);
} else {
aula.setPresenca(0);
aula.setFalta(0);
}
dao.upDateAula(aula.getIdAula(), aula);
}
}[/code]
Abçs
Marcelo Logan
estou com este problema tbm…
alguém manja ?
Posta seu TableModel e o CellEditor do ComboBox.
Obs: não uso comboBox.
TableModel:
package Objetos;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class TableModelOrdemServicoIncluir extends AbstractTableModel {
private static final int ColDescr = 0;
private static final int ColIniM = 1;
private static final int ColFimM = 2;
private static final int ColIniT = 3;
private static final int ColFimT = 4;
private static final int ColHoraViagem = 5;
private static final int ColValor = 6;
private static final int ColTotal = 7;
private List<OrdemServico> ordens;
public TableModelOrdemServicoIncluir(final List<OrdemServico> ordens) {
this.ordens = ordens;
}
public void setOrdens(List<OrdemServico> ordens) {
this.ordens = ordens;
fireTableDataChanged();
}
public TableModelOrdemServicoIncluir() {
}
public int getRowCount() {
return 10;
}
public int getColumnCount() {
return 8;
}
@Override
public String getColumnName(final int col){
switch (col){
case ColDescr:
return "Descrição";
case ColIniM:
return "Início Manhã";
case ColFimM:
return "Fim Manhã";
case ColIniT:
return "Início Tarde";
case ColFimT:
return "Fim Tarde";
case ColHoraViagem:
return "Hora/Viagem";
case ColValor:
return "Valor";
case ColTotal:
return "Total Serviço";
default:
return "";
}
}
public Object getValueAt(int rowIndex, int columnIndex) {
if (ordens != null && rowIndex >= 0 && rowIndex < ordens.size()){
OrdemServico os = ordens.get(rowIndex);
switch(columnIndex){
case 0:
return os.getId();
case 1:
return os.getDataEmissao();
case 2:
return os.getDataVencimento();
case 3:
return os.getCodigoCliente();
case 4:
return os.getTotal();
case 5:
return os.getCodigoStatus();
}
}
return null;
}
@Override
public boolean isCellEditable(int row, int col){
if(col == 7){
return false;
}else{
return true;
}
}
}
Ao rodar minha View e digitar o conteúdo em uma determinada célula e dar um TAB ou mudar de célula, o conteúdo é apagado automaticamente.
Bom…pelo menos já sei onde pequei…
Poderias me ajudar na implementação deste método ??
obrigado.
[quote=lucas_duzo]Bom…pelo menos já sei onde pequei…
Poderias me ajudar na implementação deste método ??
obrigado.[/quote]
Tá aqui um código q creio q irá te ajudar…
[code]public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
OrdemServico os = ordens.get(rowIndex);
switch(columnIndex){
case 0:
return os.setId((Long) aValue); break; //coloquei long mas não sei como vc colocou
case 1:
return os.setDataEmissao((Date) aValue); break; //java.util.Date
case 2:
return os.setDataVencimento((Date) aValue); break; //java.util.Date
case 3:
return os.setCodigoCliente((Long) aValue); break; //mesmo caso do setId
case 4:
return os.setTotal(Double.parseDouble((String) aValue)); //aqui vc é q sabe tbm, se é double, float ou bigdecimal
case 5:
return os.setCodigoStatus(Integer.parseInt((String) aValue)); //Acredito eu q seja integer :)
}
fireTableCellUpdated(rowIndex, columnIndex);
}[/code]
qualquer dúvida é só falar…
Então, neste caso, minha lista ordens
está com valores nulos, ou melhor, vazia.
neste método setValueAt, preciso pegar os valores digitados na tabela e atribuir nesta lista ordens, pois assim o meu método getValueAt irá verificar que a lista não está nula e irá adicionar e/ou fixar os dados digitados nesta tabela…
Alguma sugestão ?
obrigado.
pois é cara, deu certo…
fiz do jeito que tú falaste e retirei as condições que possuo no método getValueAt que ficou assim:
public Object getValueAt(int rowIndex, int columnIndex) {
switch(columnIndex){
case 0:
return os.getDescricaoOrdemServico();
// e assim a diante
obrigado