Olá pessoal.
Estou usando a classe ButtonColumn que encontrei aqui no site para inserir um botão dentro de uma célula do Jtable.
Personalizei para se adequar ao que eu preciso… assim ficou:
[code]class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener {
JTable table;
JButton renderButton;
JButton editButton;
String text;
int index = 0;
String cod_selo = "";
int countFiles;
String[] files = new String[999];
byte[] anexo = new byte[0];
public ButtonColumn(JTable table, int column) {
super();
this.table = table;
renderButton = new JButton();
editButton = new JButton();
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 (hasFocus) {
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
} else if (isSelected) {
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
} else {
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
renderButton.setText("Anexo");
return renderButton;
}
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
editButton.setText("Anexo");
return editButton;
}
public Object getCellEditorValue() {
return text;
}
ArrayList<HashMap<String, Object>> arli = new ArrayList<HashMap<String, Object>>();
protected void CarregaDados() throws SQLException {
conexao conn = new conexao();
conn.conecta();
conn.executeSQL("Select cod_selo,anexo,extensao from Veiculos where cod_selo=" + cod_selo);
arli.clear();
while (conn.resultset.next()) {
HashMap<String, Object> mapa = new HashMap<String, Object>();
for (String nomeCampo : GetNomesCampos()) {
mapa.put(nomeCampo, conn.resultset.getObject(nomeCampo));
}
arli.add(mapa);
}
}
protected HashMap<String, Object> Atual() {
if (arli.isEmpty()) {
return null;
} else {
return (HashMap<String, Object>) arli.get(index);
}
}
protected HashMap<String, Object> GetDados() {
HashMap<String, Object> dados = new HashMap<String, Object>();
dados.put("cod_selo", Valor("cod_selo"));
dados.put("anexo", Valor("anexo"));
dados.put("extensao", Valor("extensao"));
return dados;
}
protected Object Valor(String key) {
try {
return Atual().get(key);
} catch (Exception ex) {
return 0;
}
}
private ArrayList<String> GetNomesCampos() {
ArrayList<String> retorno = new ArrayList<String>();
HashMap<String, Object> dados = GetDados();
ArrayList<Entry<String, Object>> lista = new ArrayList<Entry<String, Object>>(dados.entrySet());
for (Entry<String, Object> dado : lista) {
retorno.add(dado.getKey());
}
return retorno;
}
public void actionPerformed(ActionEvent e) {
String fileAtual = "";
String fileAtualVetor = "";
conexao conn = new conexao();
conn.conecta();
int co = table.getSelectedRow();
cod_selo = (table.getValueAt(co, 0).toString());
String extensaofile = Atual().get("extensao").toString();
anexo = (byte[]) Valor("anexo");
if (".jpg".equals(extensaofile)) {
extensaofile = ".png";
}
File file = new File("C:\\Temp\\Arquivo Temporario - Cadastr. Veíc. IASP" + extensaofile); //Criamos um nome para o arquivo
for (int i = 0; i <= countFiles; i++) {
//se o vetor ainda não for preenchido, ou seja, se for o primeiro índice,
//eu adiciono o primeiro file no vetor e somo o contador de files(que é o índice do vetor) e quebro o for
if (files[0] == null) {
files[0] = file.toString();
countFiles++;
break;
} else {
fileAtual = file.toString();
fileAtualVetor = files[i];
//se a posição atual no vetor estiver vazia,
//atribui-se vazio em string, para que não dê erro na comparação em seguida
if (fileAtualVetor == null) {
fileAtualVetor = "";
}
// se o arquivo atual que está no vetor for igual ao file que está sendo aberto no momento,
//quebra o laço, pois se inserir um filme igual a um existente no vetor, dará erro na hora de excluir.
if (fileAtualVetor.equals(fileAtual)) {
break;
// depois de todas as comparações para verificar se o arquivo já não foi aberto e inserido no vetor,
// se não tiver sido inserido e for a ultima posição do vetor, insere-se o arquivo no vetor
} else if (i == countFiles) {
files[countFiles] = file.toString();
countFiles++;
break;
}
}
}
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file)); //Criamos o arquivo
bos.write(anexo); //Gravamos os bytes lá
bos.close(); //Fechamos o stream.
} catch (FileNotFoundException ex) {
Logger.getLogger(CadastroVeiculos.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, "Arquivo não encontrado", "OPS!", JOptionPane.WARNING_MESSAGE);
} catch (IOException ex) {
Logger.getLogger(CadastroVeiculos.class.getName()).log(Level.SEVERE, null, ex);
}
try {
Desktop.getDesktop().open(file);
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Erro no Desktop: " + ex, "Erro!", JOptionPane.ERROR_MESSAGE);
}
}
}
[/code]
Porém el dá erro nesta parte na hora de retornar o editButton:
[code]public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
editButton.setText("Anexo");
return editButton;
}[/code]
e para neste ponto(while) na classe eventdispatchThread:
void pumpEventsForFilter(int id, Conditional cond, EventFilter filter) {
addEventFilter(filter);
doDispatch = true;
while (doDispatch && !isInterrupted() && cond.evaluate()) {
pumpOneEventForFilters(id);
}
removeEventFilter(filter);
}
Eu não faço a mínima ideia do que pode estar acontecendo.
Agradeço MUITO a ajuda.