Vector<JLabel > compila pero no se agrega a la ventana.

Iniciado por bash, 2 Julio 2012, 17:36 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

Buenas tengo el siguiente codigo , bien disculpen lo de ser tan directo pero me urge aprender ahora estoy leyendo pero me gustaria saber su opinion acerca de como el siguiente codigo puede correr perfectamente. EXPLICACION :tengo un marco (JFrame ) quisiera que el vector de JLabel que tengo se agregue todo dinamicamente. creo que lo hace pero cuando quiero que el componente(JLabel ) aparezca solo aparece el ultimo. AHI ABAJO ESTA EL CODIGO.

gracias y disculpen el desorden . :xD


Código (java) [Seleccionar]
/*


    main.java



*/


import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import java.util.Vector;


class pick{
   public JLabel etiquetas(int tipo){return new JLabel();}
   public String toString(){return "$$$$$";}

}

class Facturas extends pick{
public String toString(){
return "facturas";
}
public JLabel etiquetas(int tipo){

  JLabel etiquetas = new JLabel();

  switch(tipo){
    ///1 : Facturas Comerciales.
    ///2 : Facturas Clientes Individuales.
    ///3 : Facturas Con RNC.
    ///4 : Facturas Sencillas.
    ///5 :  $moneda(depende de una clase de moneda).
   
    case 1:
     etiquetas.setText("Facturas Comerciales\n");
    break;
case 2:
     etiquetas.setText("Clientes Individuales \n");
    break;
    case 3:
     etiquetas.setText("Facturas Con RNC\n");
    break;  
         case 4:
     etiquetas.setText("Facturas Sencillas \n");
    break;




}

return etiquetas;
}

}



class LaunchGuiComponent{

    public void Launch(pick t){
   
     
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(900,700);
    window.setTitle(t.toString());
    Vector<JLabel> Etiquetas = new Vector();
    for(int i_= 0 ; i_ < 5; i_++){
Etiquetas.add(t.etiquetas(i_));
window.add(Etiquetas.elementAt(i_));
}
   
    window.setVisible(true);
   

   


    }
}



public class main{


  public static void main(String []args){

    Facturas obj = new Facturas();
    new LaunchGuiComponent().Launch(obj);

}

}
gracias por responder mis dudas

alexg88

Buenas,

Tienes algún error y te voy a hacer alguna sugerencia.

El problema lo tienes con el layout. Cada componente en Java que es contenedor de otros componentes tienen lo que se llama el layout, es decir, la forma en que se van a mostrar los elementos que se añadan al componente. El layout por defecto es null (no tiene layout), es decir, tienes que especificar concretamente donde quieres que aparezcan cada uno de los componentes (con el método setBounds, por ejemplo). Es por esto que te aparece sólo el último elemento que añades. En realidad, están todos visibles, pero el último de ellos está encima de todos los demás (están todos en la misma posición).

Código (java) [Seleccionar]

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package vector;

import java.awt.Container;
import java.awt.FlowLayout;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;

class pick {

    public JLabel etiquetas(int tipo) {
        return new JLabel();
    }

    @Override
    public String toString() {
        return "$$$$$";
    }
}

class Facturas extends pick {

    @Override
    public String toString() {
        return "facturas";
    }

    @Override
    public JLabel etiquetas(int tipo) {

        JLabel etiquetas = new JLabel();

        switch (tipo) {
            ///1 : Facturas Comerciales.
            ///2 : Facturas Clientes Individuales.
            ///3 : Facturas Con RNC.
            ///4 : Facturas Sencillas.
            ///5 :  $moneda(depende de una clase de moneda).

            case 1:
                etiquetas.setText("Facturas Comerciales\n");
                break;
            case 2:
                etiquetas.setText("Clientes Individuales \n");
                break;
            case 3:
                etiquetas.setText("Facturas Con RNC\n");
                break;
            case 4:
                etiquetas.setText("Facturas Sencillas \n");
                break;




        }

        return etiquetas;
    }
}

class LaunchGuiComponent {

    public void Launch(pick t) {


        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(900, 700);
        window.setTitle(t.toString());
        ArrayList<JLabel> Etiquetas = new ArrayList<JLabel>();

        Container contentPane = window.getContentPane();
        contentPane.setLayout(new FlowLayout());
        for (int i = 1; i < 5; i++) {
            JLabel etiqueta = t.etiquetas(i);
            Etiquetas.add(etiqueta);
            contentPane.add(etiqueta);
        }

        window.setVisible(true);





    }
}

public class main {

    public static void main(String[] args) {

        Facturas obj = new Facturas();
        new LaunchGuiComponent().Launch(obj);

    }
}



Te recomiendo que uses la clase ArrayList en vez de Vector (es una colección obsoleta).
Fíjate que el bucle debe empezar en 1 en vez de en 0, para que te aparezcan bien todas las etiquetas (en el método etiquetas, el primer valor es 1). Si usases el bucle que tu usases, tendrías que tener en cuenta que un array empieza con índice 0 y restarle 1 al valor de i.

Te fijarás que uso getContentPane y añado los JLabel allí directamente. En las últimas versiones de Java, es indistinto utilizar el método add de JFrame y el método add del panel contenedor, pero no en versiones antiguas.

Con el método setLayout se fija el tipo de layout que quieres usar (yo he elegido FlowLayout, el más sencillo,, pero puedes usar el que desees).

Saludos y suerte,

Alejandro

bash

vaya y que lo tenia en frente gracias.


yo pensaba usar al principio
Código (java) [Seleccionar]
window.setLayout(new FlowLayout());
gracias por responder mis dudas