Objeto que contem outro objeto

oii vou tentar explicar o meu problema da forma menos confusa possivel :lol:

é o seguinte, numa classe tenho um construtor que recebe como argumentos (ISBN, livro, Autor, Preco, Fornecedor fornecedor). Como tao declarados como private, criei metodos como getISBN(), getnomelivro, etc para poder acessar a partir de outra classe, fazendo livr.get ISBN(). Ate aqui tudo bem.
Mas cada objeto livro criado com esse construtor contem ele mesmo um objeto de tipo fornecedor que tb tem certos dados que queria aceder… mas nao tou conseguindo… Tb tenho metodos getnomeforn, getendr(), etc na classe fornecedor para poder acessar.
O problema é que se eu quiser afixar a lista de todos os livros criados com os fornecedores respectivos…ele me afixa sempre o mesmo fornecedor para cada livro. Fiz forn.getnomeforn() e penso que o problema vem dai porque so tou utilizando a referencia forn e nao faco nenhuma ligacao com o objeto livro. :frowning:

Alguem tem alguma ideia de como fazer?
Obrigado

confuso mesmo… Vc pode desenhar??

Como assim??

Faz assim:

livro.getFornecedor().getNomeFornecedor();

Deve resolver seu problema

Poste seu código para saber como você fez e poder te dar uma ajuda que realmente lhe ajude…
Mas eu acho que para resolver seu problema basta criar um ArrayList e um laço for que execute enquanto houver objetos dentro do Array, exibindo para cada livro os dados do seu fornecedor.

Mas posta seu código aí, para conseguir ser mais preciso.

[quote=rafagil]Faz assim:

livro.getFornecedor().getNomeFornecedor();

Deve resolver seu problema[/quote]
Pelo que eu entendi, esta parte ele está conseguindo. O problema dele é exibir o mesmo fornecedor para todos os livros. Eu acho que ele deve estar setando todos os fornecedores e depois pegando o get só do último. :?

Bom dia…

Vc pode ter um objeto dentro do outro sim. Aliás vc tem referência de um objeto para o outro.

O que vc quer fazer é muito simples. Talvez esteja errando em algum conceito de OO que é onde muitas pessoas erram feio. (inclusive eu).

public class Fornecedor{

private Integer id

}

public class Livro{

private Fornecedor fornecedor;
private Integer id;

}

Esse código diz que cada livro tem UM forncedor. E para tanto vc precisa criar um Fornecedor e passar a referência dele para a classe Livro. Feito isso todos os seus atributos poderão ser acessados na memória.

[quote=fernandoeick][quote=rafagil]Faz assim:

livro.getFornecedor().getNomeFornecedor();

Deve resolver seu problema[/quote]
Pelo que eu entendi, esta parte ele está conseguindo. O problema dele é exibir o mesmo fornecedor para todos os livros. Eu acho que ele deve estar setando todos os fornecedores e depois pegando o get só do último. :? [/quote]

Ja consegui :mrgreen: Era isso mesmo, quando eu fazia get…so o ultimo é que aparecia :smiley:

Aqui esta o codigo que eu tinha e que deveria ter mostrado na minha primeira mensagem:


class Fornecedor
{
     private int IDfornecedor;
     private String Nome;
     private String Endereco;
     private int Tel;
	
	
     public Fornecedor (int IDforn, String nome, String endereco, int tel)
    {
         this.IDfornecedor=IDforn; 
         this.nome=Nome;
         this.Endereco=endereco;
         this.Tel=tel;
    }

	
     int getIDforn()
     {
        return this.IDfornecedor;
     }

     String getnom()
     {
        return this.nome;
     }

     String getender()
     {
        return this.Endereco;
     }

     int gettel()
     {
        return this.Tel;
     }

  
(...)
class Livros
{
   private String isbn;
   private String titulo;
   private String autor;
   private String fornlivr;
   private String Fornecedor forn;

   public Livros (int ISBN, String Titulo, String Autor, Fornecedor fornecedor)
   {
        this.isbn=ISBN;
        this.titulo=Titulo;
        this.autor= Autor;
        this.fornlivr=fornecedor;
    }


    int getISBN()
   {
       return this.isbn;
   }

   String gettitulo()
   {
      return this.titulo;
   }

   String getautor()
   {
      return this.autor;
   }


(...)
class GestaoLivros
{

(...)

public void listalivros(int nbrmax)
{
    System.out.println("(5) Liste des comptes existants");
    System.out.println("ISBN \t Titulo \t Autor \t ID Fornecedor \t Nome \t Endereço \t Tel"); 
    for(int i=0; i<=nbrmax; i++)
    {		
       System.out.println(livr[i].getISBN() +"\t"+livr[i].gettitulo()+"\t"+livr[i].getautor()+
                  "\t"+forn.getIDforn()+ \"t"+ forn.getnom()+"\t"+forn.getender()+
                  "\t"+forn.gettel());
     }                                                                                                                                                              }
}

(...)[/code]

Tive que acrescentar os metodos aqui em baixo à classe Livros:
[code]  int get_idforne()
    {
        return forn.getIDforn();
    }

    int get_nome()
    {
        return forn.getnom();
    }

      int get_ender()
    {
        return forn.getender();
    }

e tive que modificar na classe GestaoLivros, o ultimo System.out.println, onde para afixar os dados do fornecedor eu tinha forn.getIDforn(), forn.getnom(), forn.getender(), forn.gettel(), etc.
Agora tenho livr[i].get_idforne(), etc.

Para alinhar os dados de cada linha em relacao à anterior eu utilizei o “\t” mas tem o problema que dependendo do tamanho das palavras, pode ficar alinhado ou nao.
Existe alguma forma automatica par alinhar?

Obrigado a todos pela ajuda.

  1. Um ponto que acho muito relevante é o nome da sua classe “Livros”, está incorreta, deve chamar “Livro”;
  2. Vc tem que analizar também a cardinalidade de seu modelo UML, se vc tem 1 fornecedor para vários livros, ou vários fornecedores para vários livros, neste caso vc terá que usar uma “collection” para dentro da classe que mantém referência a vários objetos. Assim quando vc colocar livro.getFornecedores() receberá uma coleção de fornecedores daquele livro. e Quando colocar fornecedor.getLivros() receberá uma coleção de livros daquele fornecedor. Importante, veja que as coleções é que estão no plural.

[]'s

Oi, realmente nao tinha pensado nisso, obrigado :smiley:

Em relacao à minha outra pergunta, voce ou alguem sabe como se deve fazer? Como eu disse eu utilizei o \t mas dependendo do tamanho das palavras pode ficar ou nao no sitio certo.
Fica assim:
ISBN Titulo Autor
123456 y z

Sendo que por exemplo o z deveria estar em baixo do autor :?

  1. Como vc quer usar o System.out.println() :twisted:
	public static void main(String[] args) {
	...
		System.out.println(getSmallText(livro.getTitulo()));
	...
	}

	public static String getSmallText(String s) {
		int largura = 15;
		if (s.length() > largura) {
			s = s.substring(0, 12) + "...";
		}else{
			String aux = "000000000000000"; //ao invés do "0" use espaços
			s+=aux.substring(0,largura-s.length());//pra não fazer um "for" usei uma substring
		}
		return s;
	}

ou seja, assim vc terá uma largura fixa definida onde os titulos que forem maiores que 15 caracteres sera pego 12 e acrescido …;

[quote=cezarborges]1. Como vc quer usar o System.out.println() :twisted:

	public static void main(String[] args) {
	...
		System.out.println(getSmallText(livro.getTitulo()));
	...
	}

	public static String getSmallText(String s) {
		int largura = 15;
		if (s.length() > largura) {
			s = s.substring(0, 12) + "...";
		}else{
			String aux = "000000000000000"; //ao invés do "0" use espaços
			s+=aux.substring(0,largura-s.length());//pra não fazer um "for" usei uma substring
		}
		return s;
	}

ou seja, assim vc terá uma largura fixa definida onde os titulos que forem maiores que 15 caracteres sera pego 12 e acrescido …;[/quote]

Eu so utilizo o system.out.println pq nao conheco outra forma. :mrgreen:
qual seria a outra?

[quote]Eu so utilizo o system.out.println pq nao conheco outra forma.
qual seria a outra?[/quote]
Interface Gráfica com Swing…

e com o System.out.format funciona?
Eu fiz:

System.out.format(livr[i].getISBN() +"\t"+livr[i].gettitulo()+"\t"+livr[i].getautor()+ "\t"+forn.getIDforn()+ \"t"+ forn.getnom()+"\t"+forn.getender()+ "\t"+forn.gettel());

Mas o resultado é o mesmo q com println :?
Talvez eu deva acrescentar alguma coisa, mas nao tou a ver o que. Dêem-me uma luz por favor :cry: