[Duvida] - Recuperar valor da celula TableModel (Resolvido)

4 respostas
M

Boa Tarde;

Eu não estou conseguindo recuperar o valor da minha linha em uma JTable;

Esse programa é maior, mas essa parte que estou com problemas, eu crio uma Tabela, procuro por campos em branco e crio uma outra tabela para mostrar as linhas que estão em branco;

Antes eu fazia criando a JTable passando uma String para ela;

Agora estou utilizando implementando o TableModel;

package principal;

public class valorErroBO {

	private String linha;
	private String codCliente;
	private String coluna;
	
	public valorErroBO (String linha, String codCliente, String coluna){
		this.linha=linha;
		this.codCliente=codCliente;
		this.coluna=coluna;
	}

	//Linha
	public String getLinha() {
		return linha;
	}
	public void setLinha(String linha) {
		this.linha = linha;
	}

	//Cliente
	public String getCodCliente() {
		return codCliente;
	}
	public void setCodCliente(String codCliente) {
		this.codCliente = codCliente;
	}

	//Coluna
	public String getColuna() {
		return coluna;
	}
	public void setColuna(String coluna) {
		this.coluna = coluna;
	}
		
}
package principal;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class tabelaErroBO extends AbstractTableModel {


	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1612067480246207772L;
	
	
	//Cria colunas
	private static final int COL_LINHA = 0;  
	private static final int COL_CODCLIENTE = 1;
	private static final int COL_CAMPO = 2;
	
	private List<valorErroBO> valores;
	public static int linhasDaTabelaERRO = 0;
	
	
	//recebe a lista de informações dos erros do BO  
    public tabelaErroBO() {  
          this.valores = new ArrayList<valorErroBO>();  
    }
    
    public tabelaErroBO(List<valorErroBO> lista) {
        this();
        valores.addAll(lista);
    }
    
    //retorna valor da qtdd de colunas
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 3;
	}

	//retorna valor da qtdd de linha
	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return valores.size();
	}
	
	//retorna nome das colunas
	public String getColumnName(int column) {    
		if (column == COL_LINHA)return "<html><center>Numero da <br/> Linha </center></html>";  
		if (column == COL_CODCLIENTE) return "<html><center>Código do <br/>cliente</center></html>";
		if (column == COL_CAMPO) return "<html><center>Campo</center></html>";
		return "";
	    }
	
	//retorna a classe que representa a coluna
	@Override
    public Class<String> getColumnClass(int columnIndex) {
        if (columnIndex == COL_LINHA) return String.class;
        else if (columnIndex == COL_CODCLIENTE) return String.class;
        if (columnIndex == COL_CAMPO) return String.class;
        return String.class;
    }
	
	
	@Override
	public Object getValueAt(int row, int column) {
		
		//Retorna o valor da coluna column e da linha row.  
        valorErroBO valorLinha = valores.get(row);  
        if (column == COL_LINHA) return valorLinha.getLinha();
        else if (column == COL_CODCLIENTE) return valorLinha.getCodCliente();
        else if (column == COL_CAMPO) return valorLinha.getColuna();
        return "";  
	}
	
	@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha
        valorErroBO p = valores.get(rowIndex);
 
        //verifica qual valor vai ser alterado
        if (columnIndex == COL_LINHA) p.setLinha(aValue.toString());
        else if (columnIndex == COL_CODCLIENTE) p.setCodCliente(aValue.toString());
        else if (columnIndex == COL_CAMPO) p.setColuna(aValue.toString());
           
    }
	
	
	//Bloqueia edição de celulas
	@Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
	  
	
}

Como podem ver, ao dar um clique duplo, eu quero recuperar o valor dessa celular, porém, ele nem imprime aquele "oi" que eu mando imprimir;

package principal;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;

public class JanelaErroBO extends JFrame implements MouseListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3193486845532888073L;
	
	static JTable tabErroBO;
	private JScrollPane scrollErroBO;
	static tabelaErroBO modelErro;
	public static String nomeColuna[];
	JMenuItem itemExcel;
	
	
	public JanelaErroBO (int[] linhaEmBranco, int[] clienteEmBranco, int[] colunaEmBranco){
	
	int[] valorColunaEmBranco = colunaEmBranco;
	
	//Define layout para janela
	setLayout(new BorderLayout());
	
	//Pega tamanho da resolução para criar a janela
	Toolkit tk = Toolkit.getDefaultToolkit();  
    Dimension d = tk.getScreenSize();
	setSize(299,d.height/2);
	
	//Onde estará localizada na tela
	setLocation(0, 0);
	
	//Titulo
	setTitle("Lista Erro BO"); 
	setResizable(false);
	
	JMenuBar barraPrincipalErroBO = new JMenuBar();
	JMenu menuExportar = new JMenu("Exportar Erros"); //Cria o Menu, as opções que terão no MenuBar
	
	itemExcel = new JMenuItem("Para Excel"); //Cria item BO do Menu
	itemExcel.addMouseListener(this); //Adiciona um evento de mouse para ele
	menuExportar.add(itemExcel);//Adiciona esse item ao Menu
	
	barraPrincipalErroBO.add(menuExportar);//Adiciona o Menu ao MenuBar
	
	setJMenuBar(barraPrincipalErroBO); //Adiciona o MenuBar a Janela principal
	
	nomeColuna = new String[800];
	
	//Verifica a coluna e adiciona o nome correto
	for (int b=0; linhaEmBranco[b]>0 ; b++){
	     	   if (valorColunaEmBranco[b]==1) nomeColuna[b]="Situação do Documento \n";
	      else if (valorColunaEmBranco[b]==2) nomeColuna[b]="Número do Banco \n";
	      else if (valorColunaEmBranco[b]==3) nomeColuna[b]="Nosso Número \n";
	      else if (valorColunaEmBranco[b]==4) nomeColuna[b]="Data de vencimento do boleto \n";
	      else if (valorColunaEmBranco[b]==5) nomeColuna[b]="Número da nota fiscal \n";
	      else if (valorColunaEmBranco[b]==6) nomeColuna[b]="Data da baixa do boleto \n";
	      else if (valorColunaEmBranco[b]==7) nomeColuna[b]="Valor total recebido do boleto \n";
	      else if (valorColunaEmBranco[b]==8) nomeColuna[b]="Valor do encargo de cobrança \n";
	      else if (valorColunaEmBranco[b]==9) nomeColuna[b]="Valor recebido de juros \n";
	     else if (valorColunaEmBranco[b]==10) nomeColuna[b]="Valor recebido de multa \n";
	     else if (valorColunaEmBranco[b]==11) nomeColuna[b]="Valor concedido de desconto \n";
	     else if (valorColunaEmBranco[b]==12) nomeColuna[b]="Planta \n";
	     else if (valorColunaEmBranco[b]==13) nomeColuna[b]="Código do Cliente \n";

	}
	
	//Adiciona valores as linhas e colunas
	List<valorErroBO> lista = new ArrayList<valorErroBO>();
    for (int a=0; linhaEmBranco[a]>0 ; a++)
    {
    		lista.add(new valorErroBO(String.valueOf(linhaEmBranco[a]), String.valueOf(clienteEmBranco[a]),
    				nomeColuna[a]));
    }	
    
    //cria o modelo de Erro
    modelErro = new tabelaErroBO(lista);
	
    tabErroBO = new JTable();
    
    //atribui o modelo à tabela
    tabErroBO.setModel(modelErro);
    
    tabErroBO.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	tabErroBO.getTableHeader().setReorderingAllowed(false);
	tabErroBO.setSize(500,300);
	tabErroBO.setLocation(10, 10);
	//Define largura da coluna e bloqueia edição
	tabErroBO.getColumnModel().getColumn(0).setPreferredWidth(80);  
	tabErroBO.getColumnModel().getColumn(0).setResizable(false);
	tabErroBO.getColumnModel().getColumn(1).setPreferredWidth(83);  
	tabErroBO.getColumnModel().getColumn(1).setResizable(false);
	tabErroBO.getColumnModel().getColumn(2).setPreferredWidth(110);  
	tabErroBO.getColumnModel().getColumn(2).setResizable(false);
	
	//Adiciona um scroll a tabela, sempre o scrool fica como janela principal, por isso sempre o scrool é adicionado
	//a janela e não a tabela
		
	scrollErroBO = new JScrollPane(tabErroBO, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,   
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
	scrollErroBO.setSize(500,300);
	scrollErroBO.setLocation(10, 10);
		
	//adiciona scroll a janela, por consequencia, a tabela
	add(scrollErroBO, BorderLayout.CENTER);
	
	setVisible(true);
	
	}


	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		 if (e.getClickCount() == 2)  
	        {  
			 
			 	System.out.println("oi");  
			 	System.out.println(tabErroBO.getValueAt(tabErroBO.getSelectedRow(), 0));
			 	
	        }
	}


	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource().equals(itemExcel)){
			try {
				JanelaBO.ExportarExcel();
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

}

Estou construindo de modo errado?

Eu comecei agora a utilizar o TableModel, então alguma coisa não entendi muito bem;

Eu quero pegar o numero da linha que o usuário clica e dar "foco" na tabela principal;

Se alguem puder ajudar, agradeço;

4 Respostas

mateusviccari
cara o jframe nao deve implementar o mouse listener... o mouse listener voce deve por na sua tabela, da seguinte forma(na verdade voce nem usa MouseListener, é melhor usar o MouseAdapter):
minhaJTable.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            if(e.getClickCount()==2){
                                
                            }
                        }
                    });
M
mateusviccari:
cara o jframe nao deve implementar o mouse listener... o mouse listener voce deve por na sua tabela, da seguinte forma(na verdade voce nem usa MouseListener, é melhor usar o MouseAdapter):
minhaJTable.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {
                            if(e.getClickCount()==2){
                                
                            }
                        }
                    });

Obrigado mateusviccari, eu fiz o teste e funcionou;

pq o JFrame não deve implementar o mouse listener?

Se eu não implementar, como faço a questão de Menus da janela?

mateusviccari

O mouseListener, assim como a maioria dos listeners dos componentes swing, voce adiciona somente nos componentes que vao exercer uma determinada funçao executada por aquele listener.

o que voce quer dizer com menus da janela? pois se for os menus que voce adiciona no JMenuBar, voce nao usa o mouselistener pra disparar eventos, voce usa o ActionListener:

menuItemSetores.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { System.out.println("Cliquei no menu...."); } });

M

mateusviccari:
O mouseListener, assim como a maioria dos listeners dos componentes swing, voce adiciona somente nos componentes que vao exercer uma determinada funçao executada por aquele listener.

o que voce quer dizer com menus da janela? pois se for os menus que voce adiciona no JMenuBar, voce nao usa o mouselistener pra disparar eventos, voce usa o ActionListener:

menuItemSetores.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { System.out.println("Cliquei no menu...."); } });

Hum…

Obrigado pela dica, farei uma pesquisa e vou analisar qual o melhor método;

Obrigado novamente;

Criado 6 de agosto de 2012
Ultima resposta 6 de ago. de 2012
Respostas 4
Participantes 2