Java.util.vector

Tenho uma classe que dá o seguinte erro:

the import java.util.Vector is never used

package beans;

import java.util.Vector;

public class Caixa {
	
//atributos
	
	private int codigo;
	private String data;
	private float saldoInicial, saldoFinal, valor;
	private String obs;
	
//metodos
	
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public String getObs() {
		return obs;
	}
	public void setObs(String obs) {
		this.obs = obs;
	}
	public float getSaldoFinal() {
		return saldoFinal;
	}
	public void setSaldoFinal(float saldoFinal) {
		this.saldoFinal = saldoFinal;
	}
	public float getSaldoInicial() {
		return saldoInicial;
	}
	public void setSaldoInicial(float saldoInicial) {
		this.saldoInicial = saldoInicial;
	}
	public float getValor() {
		return valor;
	}
	public void setValor(float valor) {
		this.valor = valor;
	}
	
	
	
}

Será que falta algo?

isso nao eh um ERRO…e sim um alerta…a sua IDE esta falando q vc importou uma classe q e nunca a usou…=)

Realmente … não é um erro é um warning .

Mas eu uso em outra classe:

[code]

package layout;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import persistencia.PersistenciaCaixa;
import beans.Caixa;
import excecoes.ContatoNaoExisteException;

public class CadastroCaixa extends CadastroPadrao{

private static final long serialVersionUID = 1L;

    private Caixa caixa = new Caixa();

private JPanel   jpCampos;
private JLabel   jlCodigo, jlData, jlSaldoInicial, jlSaldoFinal, jlValor,
                 jlObs;

private JTextField  jtfCodigo, jtfData, jtfSaldoInicial, jtfSaldoFinal,
					jtfValor, jtfObs;

private PersistenciaCaixa  pca = new PersistenciaCaixa();
private Caixa cx = new Caixa();

public CadastroCaixa(){
	super("Cadastro de Caixa ", true, true, true, true);

	jpCampos = new JPanel();

	jlCodigo          = new JLabel("código");
	jtfCodigo           = new JTextField(10);
	jlData            = new JLabel("data");
	jtfData             = new JTextField(20);
	jlSaldoInicial  = new JLabel("saldoinicial");
	jtfSaldoInicial   = new JTextField(20);
	jlSaldoFinal    = new JLabel("saldofinal");
	jtfSaldoFinal     = new JTextField(15);
	jlValor           = new JLabel("valor");
	jtfValor            = new JTextField(15);
	jlObs           = new JLabel("obs");
	jtfObs              = new JTextField(15);

	this.setLayout(new BorderLayout());
	jpCampos.setLayout(null);
	jpCampos.add(jlCodigo);
	jpCampos.add(jtfCodigo);
	jpCampos.add(jlData);
	jpCampos.add(jtfData);
	jpCampos.add(jlSaldoInicial);
	jpCampos.add(jtfSaldoInicial);
	jpCampos.add(jlSaldoFinal);
	jpCampos.add(jtfSaldoFinal);
	jpCampos.add(jlValor);
	jpCampos.add(jtfValor);
	jpCampos.add(jlObs);
	jpCampos.add(jtfObs);

	jlCodigo.setBounds (15, 30, 65, 25);  // MD, MS, Lrg ,Alt
	jtfCodigo.setBounds (100,30, 100, 25);
	jlData.setBounds (15, 60, 38, 25);
	jtfData.setBounds (100, 60, 100, 25);
	jlSaldoInicial.setBounds (15, 90, 100, 25);
	jtfSaldoInicial.setBounds (100, 90, 135, 25);
	jlSaldoFinal.setBounds (15, 120, 70, 25);
	jtfSaldoFinal.setBounds (100, 120, 150, 25);
	jlValor.setBounds (15, 150, 65, 25);
	jtfValor.setBounds (100, 150, 135, 25);
	jlObs.setBounds (15, 180, 80, 25);
	jtfObs.setBounds (100, 180, 125, 25);
	
	this.add(jpBotoes,BorderLayout.SOUTH);
    jpBotoes.setVisible(true);

	this.add(jpCampos);
	this.setVisible(true);
	this.pack();

	jbGravar.addActionListener(

			new ActionListener() {

        	public void actionPerformed(ActionEvent ev)
        	{	        		
        		pca.gravar(cx);
        		limpaCampos();

            }
			}
         );

==============================================================

		jbAlterar.addActionListener(

	            new ActionListener() {
	            	public void actionPerformed(ActionEvent ev){
	            		if(camposValidos()){
	            			getObjetoFromCampos();
	            			pca.alterar(cx);
	            			limpaCampos();
	            			JOptionPane.showMessageDialog(null, "Alterado");
	            		}
	            	}
				}
	     );
		=================================================================

		jbExcluir.addActionListener(

	            new ActionListener() {
	            	public void actionPerformed(ActionEvent ev){
	            		pca.excluir(getObjetoFromCampos());
	            		limpaCampos();
	            		JOptionPane.showMessageDialog(null, "Excluido");
	            	}
				}
	     );

		=================================================================

		jbBuscar.addActionListener(

				new ActionListener() {

					public void actionPerformed(ActionEvent ev)
					{
						try {
							
							Caixa cx; // =  new Caixa();
							cx = (Caixa)pca.buscar(getObjetoFromCampos());
							preencheCampos(cx);

						} catch (ContatoNaoExisteException e) {
								JOptionPane.showMessageDialog(null, e.getMessage());
						}
					}
				}
		);
}

public boolean camposValidos(){
	if(jtfCodigo.getText()=="" || jtfData.getText()=="" ||
	   jtfSaldoInicial.getText()==""|| jtfSaldoFinal.getText()==""||
	   jtfValor.getText()==""|| jtfObs.getText()=="");

	return true;
};

public Object  getObjetoFromCampos(){
	
	cx.setCodigo(Integer.parseInt(jtfCodigo.getText()));
	cx.setData(jtfData.getText());
	cx.setSaldoInicial(Float.valueOf(jtfSaldoInicial.getText()));
	cx.setSaldoFinal(Float.valueOf(jtfSaldoFinal.getText()));
	cx.setValor(Float.valueOf(jtfValor.getText()));
	cx.setObs(jtfObs.getText());

	return cx;
};

// este método é usado só quando vai gravar, porque não passa o código…
public Object gravar(){

	cx.setData(jtfData.getText());
	cx.setSaldoInicial(Float.valueOf(jtfSaldoInicial.getText()));
	cx.setSaldoFinal(Float.valueOf(jtfSaldoFinal.getText()));
	cx.setValor(Float.valueOf(jtfValor.getText()));
	cx.setObs(jtfObs.getText());
	
	return cx;
}

public void limpaCampos(){
	this.jtfCodigo.setText("");
	this.jtfData.setText("");
	this.jtfSaldoInicial.setText("");
	this.jtfSaldoFinal.setText("");
	this.jtfValor.setText("");
	this.jtfObs.setText("");
};

public void  preencheCampos(Object obj){
	limpaCampos();
	Caixa cx = (Caixa) obj;

	this.jtfCodigo.setText(""+cx.getCodigo());
	this.jtfData.setText(cx.getData());
	this.jtfSaldoInicial.setText(String.valueOf(cx.getSaldoInicial()));
	this.jtfSaldoFinal.setText(String.valueOf(cx.getSaldoFinal()));
	this.jtfValor.setText(String.valueOf(cx.getValor()));
	this.jtfObs.setText("" + cx.getObs());

}
   public static void main(String[] args) {
        new CadastroCaixa();
   }

}[/code]

Apesar que o código assima também está com um warning que é:
The field CadastroCaixa.caixa is never read locally
no código:

    private Caixa caixa = new Caixa();

E também:

package persistencia;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import beans.Caixa;

import excecoes.ContatoNaoExisteException;

public class PersistenciaCaixa {

	static PreparedStatement   stmt;
	 
	public PersistenciaCaixa() {

	}
//==============================================

	public Object buscar(Object obj) throws ContatoNaoExisteException
	{
		Caixa caixa = (Caixa) obj;
		
       java.sql.ResultSet   rs; 
       
       try {
			stmt = PersistenciaConexao.conexao.prepareStatement
			              ("select * from tbcaixa where codigo=?");
			stmt.setInt(1, caixa.getCodigo());
			rs = stmt.executeQuery();
		    if (rs.first())
		    {		    	
		    	caixa.setCodigo  		    (rs.getInt("codigo"));
		    	caixa.setData    			(rs.getString("data"));
		    	caixa.setSaldoInicial       (rs.getFloat("saldoinicial"));
		    	caixa.setSaldoFinal         (rs.getFloat("saldofinal"));
		    	caixa.setValor              (rs.getFloat("valor"));	    
		    	caixa.setObs                (rs.getString("obs"));
		    		
			    return caixa;			    
		     }
		    else
		       throw new ContatoNaoExisteException("O caixa " + caixa.getCodigo() +
		    		                               " não está cadastrado");
		    		    
		} catch (SQLException e) {

			e.printStackTrace();
			return null;
		}				
	}
//==============================================
	public void gravar(Object obj) 
	{
		
		Caixa caixa = (Caixa) obj;
		try {
		   	   	stmt = PersistenciaConexao.conexao
			    .prepareStatement("insert into tbcaixa(codigo, data, saldoinicial, " +
			    		           "saldofinal, valor, obs)" + 
						                       "values(null,?,?,?,?,?)");
		   	      	   	
				   stmt.setString  (1, caixa.getData());
				   stmt.setFloat   (2, caixa.getSaldoInicial());
				   stmt.setFloat   (3, caixa.getSaldoFinal());
				   stmt.setFloat   (4, caixa.getValor());
				   stmt.setString  (5, caixa.getObs());				   

				   stmt.execute();
  		
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
//	==========================================================================
	
	public void excluir(Object obj) 
	{
		Caixa caixa = (Caixa) obj;
		try {			
			     stmt = PersistenciaConexao.conexao
			    .prepareStatement("delete from tbcaixa where codigo=?");
			   
			   stmt.setInt(1, caixa.getCodigo());
			   stmt.execute();
	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
//==========================================================================
	
	public void alterar(Object obj)	{
		try {
			
			Caixa caixa = (Caixa) obj;
		
		 	   stmt = PersistenciaConexao.conexao
			    .prepareStatement("update tbcaixa set data=?, saldoinicial=?, " +
			    		"saldofinal=?, valor=?, obs=? where codigo=?");
			   
		 	   stmt.setString  (1, caixa.getData());
			   stmt.setFloat   (2, caixa.getSaldoInicial());
			   stmt.setFloat   (3, caixa.getSaldoFinal());
			   stmt.setFloat   (4, caixa.getValor());
			   stmt.setString  (5, caixa.getObs());			  
			   			   
			   stmt.setInt     (6, caixa.getCodigo());
			   stmt.execute();
		 		   
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
//	==========================================================================
	
	public Vector buscarTudo(){
		
		     ResultSet         rs;
		     
		     Vector<Caixa> caixa = new Vector<Caixa>();
		        
		     try {
					stmt = PersistenciaConexao.conexao.prepareStatement
					             ("select * from tbcaixa");
				    rs = stmt.executeQuery();
				    while (rs.next())
				    {
				    	Caixa cai = new Caixa();
				       	
				    	cai.setCodigo        (rs.getInt("codigo"));
				    	cai.setData          (rs.getString("data"));
				    	cai.setSaldoInicial  (rs.getFloat("saldoinicial"));
				    	cai.setSaldoFinal    (rs.getFloat("saldofinal"));
				    	cai.setValor         (rs.getFloat("valor"));
				    	cai.setObs           (rs.getString("obs"));
				    			   								
				    	caixa.add(cai);
				    }
				    return caixa;
				    
				} catch (SQLException e) {					
					e.printStackTrace();
					return null;
				}		
	}	
}

O que eu fiz de errado?

Por favor nesse caso o que eu deveria ter feito?

vc deve dar o import apenas na classe q vc realmente vai utilizar a classe q vc quer importar… (entendeu?! rs, ficou confuso ne…)

Classe A, Classe B, Classe C

Na sua Classe C vc importa a Classe A para pode usa-la…nao quer dizer q vc necessariamente precisa importar tb na Classe B…vc so importa se vc usar la tb…importar so por importar nao vai te auxiliar em nada, pelo contrario…vai eh te rum monte de import la atrapalhando a leitura do code …e q sequer foram usadas…
neste seu caso, basta tirar o import q o seu codigo vai continuar funcionando perfeitamente

Ok o warning sumiu:

e quanto ao segundo warning que eu relatei acima? ele não sumiu.

The field CadastroCaixa.caixa is never read locally
no código:

private Caixa caixa = new Caixa();

oq que será?

The field CadastroCaixa.caixa [color=red][size=18]is never read[/size][/color] locally

voce nao utilizou seu objeto caixa na classe CadastroCaixa, apenas declarou ele.

criar uma variavel e nunca usar…

Exatamente…
o pessoal ai emcima disse tudo ja…

basta vc comentar ou apagar esta linha q ele some =)

nao tem pq vc declarar ou importar algo q NUNCA VAI USAR…
=)

[]'s

Só continuando minha campanha. Não use Vector, use List!

Motivos: http://www.guj.com.br/posts/list/71926.java#378301
Como usar: http://www.guj.com.br/posts/list/74068.java#389435

viniGodoy eu tb sou de opiniao que os arraylist sao maneros( Muito bom)…
e usando o ciclo (each for) é k mil maravilhas…

:smiley:

OK PESSOAL EU FIZ ISSO E SUMIU OS WARNINGS MAS AINDA TENHO UM QUE É O SEGUINTE:

The serializable class ContatoNaoExisteException does not declare a static final serialVersionUID fild of type long.

[code]
package excecoes;

public class ContatoNaoExisteException extends Exception
{
public ContatoNaoExisteException(String message)
{
super(message);

}

}[/code]

Mais especificamente na linha de codigo:

public class ContatoNaoExisteException extends Exception 

Mas eu declaro isso nas minhas classes de layout vejam:

package layout;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import persistencia.PersistenciaCaixa;
import beans.Caixa;
import excecoes.ContatoNaoExisteException;

public class CadastroCaixa extends CadastroPadrao{
	
	private static final long serialVersionUID = 1L;

	//    private Caixa caixa = new Caixa();

	private JPanel   jpCampos;
	private JLabel   jlCodigo, jlData, jlSaldoInicial, jlSaldoFinal, jlValor,
	                 jlObs;

	private JTextField  jtfCodigo, jtfData, jtfSaldoInicial, jtfSaldoFinal,
    					jtfValor, jtfObs;

	private PersistenciaCaixa  pca = new PersistenciaCaixa();
	private Caixa cx = new Caixa();

	public CadastroCaixa(){
		super("Cadastro de Caixa ", true, true, true, true);

		jpCampos = new JPanel();

		jlCodigo          = new JLabel("código");
		jtfCodigo           = new JTextField(10);
		jlData            = new JLabel("data");
		jtfData             = new JTextField(20);
		jlSaldoInicial  = new JLabel("saldoinicial");
		jtfSaldoInicial   = new JTextField(20);
		jlSaldoFinal    = new JLabel("saldofinal");
		jtfSaldoFinal     = new JTextField(15);
		jlValor           = new JLabel("valor");
		jtfValor            = new JTextField(15);
		jlObs           = new JLabel("obs");
		jtfObs              = new JTextField(15);

		this.setLayout(new BorderLayout());
		jpCampos.setLayout(null);
		jpCampos.add(jlCodigo);
		jpCampos.add(jtfCodigo);
		jpCampos.add(jlData);
		jpCampos.add(jtfData);
		jpCampos.add(jlSaldoInicial);
		jpCampos.add(jtfSaldoInicial);
		jpCampos.add(jlSaldoFinal);
		jpCampos.add(jtfSaldoFinal);
		jpCampos.add(jlValor);
		jpCampos.add(jtfValor);
		jpCampos.add(jlObs);
		jpCampos.add(jtfObs);

		jlCodigo.setBounds (15, 30, 65, 25);  // MD, MS, Lrg ,Alt
		jtfCodigo.setBounds (100,30, 100, 25);
		jlData.setBounds (15, 60, 38, 25);
		jtfData.setBounds (100, 60, 100, 25);
		jlSaldoInicial.setBounds (15, 90, 100, 25);
		jtfSaldoInicial.setBounds (100, 90, 135, 25);
		jlSaldoFinal.setBounds (15, 120, 70, 25);
		jtfSaldoFinal.setBounds (100, 120, 150, 25);
		jlValor.setBounds (15, 150, 65, 25);
		jtfValor.setBounds (100, 150, 135, 25);
		jlObs.setBounds (15, 180, 80, 25);
		jtfObs.setBounds (100, 180, 125, 25);
		
		this.add(jpBotoes,BorderLayout.SOUTH);
        jpBotoes.setVisible(true);

		this.add(jpCampos);
		this.setVisible(true);
		this.pack();

		jbGravar.addActionListener(

				new ActionListener() {

	        	public void actionPerformed(ActionEvent ev)
	        	{	        		
	        		pca.gravar(cx);
	        		limpaCampos();

	            }
				}
	         );

			// ==============================================================

			jbAlterar.addActionListener(

		            new ActionListener() {
		            	public void actionPerformed(ActionEvent ev){
		            		if(camposValidos()){
		            			getObjetoFromCampos();
		            			pca.alterar(cx);
		            			limpaCampos();
		            			JOptionPane.showMessageDialog(null, "Alterado");
		            		}
		            	}
					}
		     );
			//=================================================================

			jbExcluir.addActionListener(

		            new ActionListener() {
		            	public void actionPerformed(ActionEvent ev){
		            		pca.excluir(getObjetoFromCampos());
		            		limpaCampos();
		            		JOptionPane.showMessageDialog(null, "Excluido");
		            	}
					}
		     );

			//=================================================================

			jbBuscar.addActionListener(

					new ActionListener() {

						public void actionPerformed(ActionEvent ev)
						{
							try {
								
								Caixa cx; // =  new Caixa();
								cx = (Caixa)pca.buscar(getObjetoFromCampos());
								preencheCampos(cx);

							} catch (ContatoNaoExisteException e) {
									JOptionPane.showMessageDialog(null, e.getMessage());
							}
						}
					}
			);
	}

	public boolean camposValidos(){
		if(jtfCodigo.getText()=="" || jtfData.getText()=="" ||
		   jtfSaldoInicial.getText()==""|| jtfSaldoFinal.getText()==""||
		   jtfValor.getText()==""|| jtfObs.getText()=="");

		return true;
	};

	public Object  getObjetoFromCampos(){
		
		cx.setCodigo(Integer.parseInt(jtfCodigo.getText()));
		cx.setData(jtfData.getText());
		cx.setSaldoInicial(Float.valueOf(jtfSaldoInicial.getText()));
		cx.setSaldoFinal(Float.valueOf(jtfSaldoFinal.getText()));
		cx.setValor(Float.valueOf(jtfValor.getText()));
		cx.setObs(jtfObs.getText());

		return cx;
	};
	
//	 este método é usado só quando vai gravar, porque não passa o código.... 	
	public Object gravar(){
		
		cx.setData(jtfData.getText());
		cx.setSaldoInicial(Float.valueOf(jtfSaldoInicial.getText()));
		cx.setSaldoFinal(Float.valueOf(jtfSaldoFinal.getText()));
		cx.setValor(Float.valueOf(jtfValor.getText()));
		cx.setObs(jtfObs.getText());
		
		return cx;
	}

	public void limpaCampos(){
		this.jtfCodigo.setText("");
		this.jtfData.setText("");
		this.jtfSaldoInicial.setText("");
		this.jtfSaldoFinal.setText("");
		this.jtfValor.setText("");
		this.jtfObs.setText("");
	};

	public void  preencheCampos(Object obj){
    	limpaCampos();
    	Caixa cx = (Caixa) obj;

    	this.jtfCodigo.setText(""+cx.getCodigo());
    	this.jtfData.setText(cx.getData());
		this.jtfSaldoInicial.setText(String.valueOf(cx.getSaldoInicial()));
		this.jtfSaldoFinal.setText(String.valueOf(cx.getSaldoFinal()));
		this.jtfValor.setText(String.valueOf(cx.getValor()));
		this.jtfObs.setText("" + cx.getObs());

	}
	   public static void main(String[] args) {
	        new CadastroCaixa();
	   }

}

SÓ SE EU TERIA QUE TER FEITO ALGUMA CONFIGURAÇÃO DE SERIALIZAÇÃO EU USO O ECLIPSE 3.2 TALVEZ NÃO SEI OU FALTA ALGO NO CÓDIGO?

Nossa kra, va estudar ingles.

Bem… mas ja que vc usa o eclipse tem uma dica:

Na linha que tá amerelinho (de warning), do lado esquerdo do editor tem um simbolozinho. Note que o simbolo so aparece na linha que gera o warning. Nesse ultimo caso que ele sublinha na declaracao da classe tem lah um icone bem pequeninho do lado esquerdo…
Pois eh… vc clica nele que o Eclipse vai te dar umas sugestoes…

Olha pra mim não é uma questão se saber ou não ingles…

E essa dica de clicar eu já sabia só não sei especificamente em que clicar pois a lista é enorme

E já q vc é tão esperto poderia me sugerir algo???

serializable class ContatoNaoExisteException does not declare a static final serialVersionUID fild of type long.
isso tem a a ver com serializable das classe…tu deves ter implementado um serials para as tuas classes do projecto…
vou postar um exemplo:

[code]
package dataStructures;

import java.io.Serializable;

class DListNode<E> implements Serializable
{

static final long serialVersionUID = 0L;

package dataStructures;

public class DoublyLLIterator<E> implements TwoWayIterator<E>
{

static final long serialVersionUID = 0L;


// Node with the first element in the iteration.
protected DListNode&lt;E&gt; firstNode;

no teu caso é :
private static final long serialVersionUID = 1L;
tns de por isso em todas as classes do projecto menos na main(ou na de teste…)

em todas classes tens de fazer este serial manhoso…

espero ter ajudado…

[quote=narinha]Olha pra mim não é uma questão se saber ou não ingles…

E essa dica de clicar eu já sabia só não sei especificamente em que clicar pois a lista é enorme

E já q vc é tão esperto poderia me sugerir algo???
[/quote]

a questao nao é saber ingles ou nao, a questao é ler e interpretar.
sinceramente eu axo mais legal voce ler o warning e, a partir dele, pesquisar em livros ou google ou aqui mesmo no forum sobre o assunto,
e caso voce nao consiga entender, ou resolver seu problema, dai sim voce abre um topico com suas duvidas.
porque alem de aprender como funciona os warnings e erros e exceptions, voce se familiariza com cada um deles, fazendo assim com que
voce nao repita mais esses tipos de erros de programação, tornando seu código cada vez mais eficiente, e seu conhecimento cada vez maior.

compreende a diferença?

Ow, não precisa ser grosso. Além do mais, esse warning não é tão óbvio assim.

Várias classes implementam a interface serializable. Isso inclui, por exemplo, as classes do Swing, classes de listas, etc. Se você criar um filho de uma dessas classes esse warning vai te atormentar.

O que ele quer dizer é que você não deveria serializar esse objeto, pois não implementou corretamente a interface serializable. Essa interface exige que você tenha um campo chamado serialVersionUID.

Muita gente não usa serialização. Se ela não está presente no seu sistema, sugiro que você procure na sua IDE sobre como desligar esse warning. No caso do eclipse, em windows->preferences->compiler&debbugger->erros&warnings existe uma opção para fazer isso.

É… compreendo… tanto que foi o que eu fiz.

Depois de procurar no forum no google etc até perguntei em uma outra pesquisa minha ai então resolvi postar.

Muito obrigada pela compereenção!

E ALKAMAVO MUITO OBRIGADA PELA DICA VOU FAZER E DEPOIS TE DIGO SE DEU CERTO.

BRIGADOOOOOOOO!!! BJUS!

:slight_smile: VINIGODOY VC É UM ANJO :oops: … BRIGADOOOOO!!! :thumbup: