Arquivo da tag: exemplo

Clonar objetos no Java

No Java o método clone() provê a criação de uma cópia similar ao objeto original. Em outras palavras o método copia campo a campo da classe clonada.
Para tornar uma classe clonável no Java são necessárias duas ações: implementar a interface “Cloneable” e sobrescrever o método clone(). É preciso ter em mente que ao clonar uma instância de uma classe os atributos primitivos (int, float, double, char, byte, etc…) são uma nova cópia do objeto original, já o atributo tipado (objeto de classe) acoplado terá por padrão copia da referencia original, ou seja, se mudamos o valor no atributo do objeto acoplado, todos que enxergam a mesma referencia serão afetado com a alteração.
Vamos ao primeiro exemplo de clonagem simples demonstrando a questão do atributo referenciado:
Classe Main

package mydelirium;
/**
 *
 * @author Ricardo Spinoza
 */
public class MyDelirium {

    /**
     * @param args the command line arguments
     * @throws java.lang.CloneNotSupportedException
     */
    public static void main(String[] args) throws CloneNotSupportedException{
        
        Dog dogOriginal = new Dog();        
        dogOriginal.setName("Ted");
        dogOriginal.setRace("Pitbull");
        
        Person personOriginal = new Person();
        personOriginal.setAge(24);
        personOriginal.setName("Jonnhy");
        personOriginal.setDogFriend(dogOriginal);
        
        Person personClone = (Person) personOriginal.clone();        
        
        System.out.println("original >> name: " + personOriginal.getName() + " age:" +personOriginal.getAge()+ " dog name:" + personOriginal.getDogFriend().getName()+ " dog race:" + personOriginal.getDogFriend().getRace());
        System.out.println("cloned >>>> name: " + personClone.getName() + " age:" +personClone.getAge()+ " dog name:" + personClone.getDogFriend().getName()+ " dog race:" + personClone.getDogFriend().getRace());
        //System.out.println("orginal equals cloned: " + personOriginal.equals(personClone));
        
        System.out.println("Dog é uma referencia comum entre os dois objetos (original e clonado)? "
                + personOriginal.getDogFriend().equals(personClone.getDogFriend()));
        
        System.out.println();
        
        personOriginal.getDogFriend().setName("Xena");
        personOriginal.getDogFriend().setRace("Yourshire Terrier");
        personOriginal.setAge(33);
        
        System.out.println("Ou seja, ao mudar o objeto Dog teremos: \n");
        
        System.out.println("original >> name: " + personOriginal.getName() + " age:" +personOriginal.getAge()+ " dog name:" + personOriginal.getDogFriend().getName()+ " dog race:" + personOriginal.getDogFriend().getRace());
        System.out.println("cloned >>>> name: " + personClone.getName() + " age:" +personClone.getAge()+ " dog name:" + personClone.getDogFriend().getName()+ " dog race:" + personClone.getDogFriend().getRace());                
    } 
}

Classe Person

package mydelirium;

/**
 *
 * @author Ricardo.Pereira
 */
public class Person implements Cloneable{
    
    private int age;    
    private String name;
    
    private Dog dogFriend;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dog getDogFriend() {
        return dogFriend;
    }

    public void setDogFriend(Dog dogFriend) {
        this.dogFriend = dogFriend;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); 
    }
    
}

Classe Dog

package mydelirium;

/**
 *
 * @author Ricardo.Pereira
 */
public class Dog{
 
    private String name;
    private String race;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }
}

A saída do código será:

<pre>original >> name: Jonnhy age:24 dog name:Ted dog race:Pitbull
cloned >>>> name: Jonnhy age:24 dog name:Ted dog race:Pitbull
Dog é uma referencia comum entre os dois objetos (original e clonado)? true
Ou seja, ao mudar o objeto Dog teremos: 
original >> name: Jonnhy age:33 dog name:Xena dog race:Yourshire Terrier
cloned >>>> name: Jonnhy age:24 dog name:Xena dog race:Yourshire Terrier

No exemplo clonamos o objeto original que possui o atributo dogFriend (da classe Dog) o qual possui a mesma referencia nos objetos personOriginal e personClone. Observe que qualquer mudança de valor no atributo dogFriend o objeto original e clonado são afetados.
Para resolver o problema da referencia neste cenário precisaremos adicionar o método clone() na nossa classe Dog (obviamente implementar a interface Clonable) e alterar o método clone() definido na nossa classe Person para clonar o objeto Dog e assim isolar as referências de cada objeto.
Segue as mudanças no segundo exemplo:
Classe Main

package mydelirium;
/**
 *
 * @author Ricardo Spinoza
 */
public class MyDelirium {

    /**
     * @param args the command line arguments
     * @throws java.lang.CloneNotSupportedException
     */
    public static void main(String[] args) throws CloneNotSupportedException{
        
        Dog dogOriginal = new Dog();        
        dogOriginal.setName("Ted");
        dogOriginal.setRace("Pitbull");
        
        Person personOriginal = new Person();
        personOriginal.setAge(24);
        personOriginal.setName("Jonnhy");
        personOriginal.setDogFriend(dogOriginal);        
        Person personClone = (Person) personOriginal.clone();                
        System.out.println("original >> name: " + personOriginal.getName() + " age:" +personOriginal.getAge()+ " dog name:" + personOriginal.getDogFriend().getName()+ " dog race:" + personOriginal.getDogFriend().getRace());
        System.out.println("cloned >>>> name: " + personClone.getName() + " age:" +personClone.getAge()+ " dog name:" + personClone.getDogFriend().getName()+ " dog race:" + personClone.getDogFriend().getRace());        
        System.out.println("Dog é uma referencia comum entre os dois objetos (original e clonado)? "
                + personOriginal.getDogFriend().equals(personClone.getDogFriend()));
        
        System.out.println();
        
        personOriginal.getDogFriend().setName("Xena");
        personOriginal.getDogFriend().setRace("Yourshire Terrier");
        personOriginal.setAge(33);
        
        System.out.println("Ao mudar o objeto Dog no objeto original teremos: \n");
        
        System.out.println("original >> name: " + personOriginal.getName() + " age:" +personOriginal.getAge()+ " dog name:" + personOriginal.getDogFriend().getName()+ " dog race:" + personOriginal.getDogFriend().getRace());
        System.out.println("cloned >>>> name: " + personClone.getName() + " age:" +personClone.getAge()+ " dog name:" + personClone.getDogFriend().getName()+ " dog race:" + personClone.getDogFriend().getRace());
                
    }
    
}

Classe Person

package mydelirium;

/**
 *
 * @author Ricardo.Pereira
 */
public class Person implements Cloneable{
    
    private int age;    
    private String name;
    
    private Dog dogFriend;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dog getDogFriend() {
        return dogFriend;
    }

    public void setDogFriend(Dog dogFriend) {
        this.dogFriend = dogFriend;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person cloned = (Person)super.clone();
        //faz o clone do objeto dogFriend
        cloned.setDogFriend((Dog)cloned.getDogFriend().clone());
        return cloned;
    }
    
}

Classe Dog

package mydelirium;

/**
 *
 * @author Ricardo.Pereira
 */
public class Dog implements Cloneable{
 
    private String name;
    private String race;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRace() {
        return race;
    }

    public void setRace(String race) {
        this.race = race;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

A saída do código será:

original >> name: Jonnhy age:24 dog name:Ted dog race:Pitbull
cloned >>>> name: Jonnhy age:24 dog name:Ted dog race:Pitbull
Dog é uma referencia comum entre os dois objetos (original e clonado)? false

Ao mudar o objeto Dog no objeto original teremos: 

original >> name: Jonnhy age:33 dog name:Xena dog race:Yourshire Terrier
cloned >>>> name: Jonnhy age:24 dog name:Ted dog race:Pitbull

Por fim, a clonagem de objetos facilita criar cópias de objeto, porém é preciso ter alguns cuidados com relação a referencia de objetos tipados entre o objeto original e o clonado.

Dúvidas, criticas, sugestões, por favor escreva 🙂
Referencia:

API Java Object clone() http://http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()
Leia mais em A guide to object cloning in java <http://howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/&gt;

Anúncios

Deixe um comentário

Arquivado em Java

JQuery – exemplos de uso – combo-box

Salve,

JQuery é um biblioteca Java-Script que facilita mto a vida do desenvolvedor web. Este post expoem exemplos pontuais para manipular combo-box html com JQuery.

//retorna o valor referente posição selecionada do combo.
//lembrando que a primeira posição inicia em zero
$("#idDoSeuComboBox").attr("selectedIndex")

//posiciona o seleted da combo no indice indicado
//neste exemplo o nro zero posiciona na primeira posição da combo
$("#idDoSeuComboBox").attr('selectedIndex', 0);

// posiciona no value correspondente
$('select').val('1'); //se sua combo tiver value="1" vai selecionar

//posiciona pelo texto correspondente
$('select').val('Two'); //se sua combo o texto="Two" vai selecionar

//retorna o texto do value especificado
$("#idDoSeuComboBox option[value='2']").text()

//retorna o texto referente ao item selecionado na combo
$("#idDoSeuComboBox option:selected").text();
//ou
$("#idDoSeuComboBox :selected").text();

//recupera o value corrente da combo
$("#idDoSeuComboBox").val();

//recupera o segundo option de seu select (combo) - thiagobfiorenza comments
$("#idDoSeuComboBox").eq(2);

Se vc souber alguém exemplo não abordado aqui. sinta a vontade pra postar o comentários do post 🙂

4 Comentários

Arquivado em JavaScript/Afins

Como ler e escrever arquivos e listar drives com JavaScript

Os dois primeiros exemplos usam ActiveX, ou seja, rodam apenas no Internet Explorer, o ultimo roda em qualquer browser.
No link de referência ao final do post os caras usam extensão pra fazer o mesmo sem ActiveX.

Usando JavaScript para escrever um arquivo (usa ActiveX):

function WriteFile()
{
   var fso  = new ActiveXObject("Scripting.FileSystemObject");
   var fh = fso.CreateTextFile("c:\\Test.txt", true);
   fh.WriteLine("Some text goes here...");
   fh.Close();
}
//chamada da função
 WriteFile();

Listando drives disponíveis na sua máquina (usa ActiveX):

function ShowAvailableDrives()
{
    document.write(GetDriveList());
}

function GetDriveList()
{
 var fso, s, n, e, x;
 fso = new ActiveXObject("Scripting.FileSystemObject");
 e = new Enumerator(fso.Drives);
 s = "";
 do
 {
   x = e.item();
   s = s + x.DriveLetter;
   s += ":-    ";
   if (x.DriveType == 3)     n = x.ShareName;
   else if (x.IsReady)     n = x.VolumeName;
   else                     n = "[Drive not ready]";
   s += n + "<br>";
   e.moveNext();
 }  while (!e.atEnd());
 
 return(s);
}
//chamada da função
ShowAvailableDrives();

Usando JavaScript para ler arquivos (NÃO usa ActiveX):

<!--
var srcFrame;
//External content into a layer
function loadOuter(doc) {
 srcFrame = document.getElementById("hiddenContent");
 srcFrame.src = doc;
 // workaround for missing onLoad event in IFRAME for NN6
 if (!srcFrame.onload) {
  setTimeout("transferHTML()", 1000)
 }
}

function transferHTML(){
 srcContent='';
 if (srcFrame.contentDocument){
  srcContent=srcFrame.contentDocument.getElementsByTagName("BODY")[0].innerHTML;
 }
 else if (srcFrame.contentWindow){
  srcContent=srcFrame.contentWindow.document.body.innerHTML;
 }
 document.getElementById("outerDisplay").innerHTML = srcContent
}


var DocAry=new Array('Test.txt','Test2.txt');

function SelectList(v){
 if (v>0){
  loadOuter(DocAry[v-1]);
 }
}
//uso
//
//<INPUT TYPE="button" VALUE="Test.txt" onClick="loadOuter('Test.txt')" >
//<INPUT TYPE="button" VALUE="Test2.txt" onClick="loadOuter('Test2.txt')" >
//

Para rodar o exemplo de leitura crie os arquivos Test.txt e Test2.txt no mesmo diretório da página html do exemplo:

Test.txt
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7

Test2.txt
Item 11
Item 12
Item 13
Item 14
Item 15
Item 16
Item 17

Quem quiser contribuir com outros exemplos de ler, escrever e listar diretórios compativeis com os demais navegadores, posta ai que atualizo no post e crédito a devida autoria 🙂

Referências:
How to read and write files in JavaScript. http://www.c-point.com/JavaScript/articles/file_access_with_JavaScript.htm acessado em 23/08/2011
vwphillips. Codingforuns. http://www.codingforums.com/showthread.php?t=647 acessado em 23/08/2011

Deixe um comentário

Arquivado em JavaScript/Afins

Exemplo de como criar IFrame via javascript

Abaixo função javascript que cria uma iframe dinamicamente.

<script language="JavaScript" type="text/javascript">
function makeFrame() {
   ifrm = document.createElement("IFRAME");
   ifrm.setAttribute("src", "http://www.google.com.br/");
   ifrm.style.width = 800+"px";
   ifrm.style.height = 600+"px";
   document.body.appendChild(ifrm);
}
</script>

Exemplo completo está disponível no link: exemplo_criar_iframe_dinamico.html

3 Comentários

Arquivado em JavaScript/Afins

Exemplo de uso de HashMap

A classe HashMap é uma implementação da interface Map do pacote java.util, e possibilita trabalhar com mapeamento de objetos no esquema chave/valor, ou seja, informada a chave, resgato o valor.

Segue exemplo de uso:


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

//font: http://www.easywayserver.com/blog/java-map-example/

public class MapExample {

    public static void main(String[] args) {

        Map<Object,String> mp=new HashMap<Object, String>();

        // adding or set elements in Map by put method key and value pair
        mp.put(new Integer(2), "Two");
        mp.put(new Integer(1), "One");
        mp.put(new Integer(3), "Three");
        mp.put(new Integer(4), "Four");

        //Get Map in Set interface to get key and value
        Set s=mp.entrySet();

        //Move next key and value of Map by iterator
        Iterator it=s.iterator();

        while(it.hasNext())
        {
            // key=value separator this by Map.Entry to get key and value
            Map.Entry m =(Map.Entry)it.next();

            // getKey is used to get key of Map
            int key=(Integer)m.getKey();

            // getValue is used to get value of key in Map
            String value=(String)m.getValue();

            System.out.println("Key :"+key+"  Value :"+value);
        }
    }
}

Notas:
a classe HashMap não é sincronizada (perigoso em ambiente multi-threads) e não trabalha com ordenação dos elementos (Para map ordenado, veja TreeMap)

Deixe um comentário

Arquivado em Java

JavaScript – Como executar uma função após detectar o Enter do usuário no campo do formulário. Testado no IE/Firefox/Opera

Segue o código:

  if ((window.event ? event.keyCode : event.which) == 13) {
      myfuncJs();
  }

Explicação: O evento é capturado por window.event, o número do caracter correspondente a tecla pressionada está disponível no keyCode ou which dependendo do seu navegador. O código 13 corresponde ao Enter conforme a tabela ASCII.

Confira o exemplo rodando em um formulário em exemplo_captura_enter_form.html

6 Comentários

Arquivado em Browser, HTML, JavaScript/Afins

Wicket – Capturar resolução de tela dinamicamente.

Apache Wicket é uma framework para o desenvolvimento de aplicações Web para Java baseado em componentes. O Wicket abstrai o meio-de-campo entre o HTML e o Java. Bom, chega de bla bla bla…, vamos ao que interessa, que é o exemplo de como capturar a resolução de tela do cliente dinamicamente.
O objeto que representa as informações do cliente web é WebClientInfo (pacote org.apache.wicket.protocol.http.request.WebClientInfo) que servirá de base para armazenar a request com método de acesso getRequestCycle().getClientInfo(). Com objeto populado, basta acessar as properties e ler a largura com o metodo p.getScreenWidth() e altura com o metodo p.getScreenHeight().  Segue trecho do código:

WebClientInfo info = (WebClientInfo)getRequestCycle().getClientInfo();
ClientProperties p = info.getProperties();
int width = p.getScreenWidth();
int height = p.getScreenHeight();

No meu caso o objetivo era redimensionar uma modal no Wickit, fiz assim:

add(minhaModal = new ModalWindow("minhaModal"));
minhaModal.setPageMapName("minhaModal");
--definição da unidade utilizada,
neste caso em pixels
minhaModal.setHeightUnit("px");
minhaModal.setWidthUnit("px");

--definicão da altura
minhaModal.setInitialHeight(height);

--definição da largura
minhaModal.setInitialWidth(width);

minhaModal.setPageCreator(new ModalWindow.PageCreator() {

@Override
public Page createPage() {
return new MinhaClasseModal(Documento.this, minhaModal);
}
});

Importante: O Wicket precisa de liberação para obter informações do cliente. Para isto, adicione o método abaixo no seu init()

getRequestCycleSettings().setGatherExtendedBrowserInfo(true);

Referências:
Apache Wicket. http://pt.wikipedia.org/wiki/Apache_Wicket. acessado em 15/04/2011.
Exemplo de uso da Modal no Wicket. http://wicketstuff.org/wicket13/ajax/modal-window.1. acessado em 15/04/2011.

1 comentário

Arquivado em Frameworks, wicket