No se me dibujan los componentes gráficos hasta que modifico el tamaño del Frame

Iniciado por -Localhost-, 29 Julio 2010, 07:51 AM

0 Miembros y 2 Visitantes están viendo este tema.

-Localhost-

Hola a todos,

Bueno estaba haciendo un ejercicio que me mandaron que consiste en poner unos componentes gráficos en un frame (para más adelane hacer que cumplan la función que deberían). El código es el siguiente:

Código (java) [Seleccionar]
import java.awt.*;
import eje01.sColor;

public class mueveCosasDibujables extends Frame {



private String colores[] =  {"negro","azul","cyan","gris oscuro","gris","verde","gris claro","magenta","naranja","rosa","rojo","blanco","amarillo"};
private String[] coloresFondo= colores,coloresTexto = colores;


private Button BTarriba= new Button("arriba"),
      BTabajo= new Button("abajo"),
      BTizquierda= new Button("izquierda"),
      BTderecha= new Button ("derecha"),
      BTaumentar= new Button("aumentar"),
      BTdisminuir= new Button("disminuir");

private Choice CHfiguras = new Choice();
private sColor sColoresFondo= new sColor("Color de fondo",coloresFondo),sColoresTexto = new sColor("Color del texto",coloresTexto);

private GridLayout GLnorte = new GridLayout(3,1), GLsur = new GridLayout(6,1);
private Panel PNnorte = new Panel(), PNsur = new Panel();

public mueveCosasDibujables() {

setVisible(true);
setSize(400,400);
setLocation(500,200);
setLayout(new BorderLayout());

CHfiguras.addItem("Selecciona figura");
CHfiguras.addItem("Cuadrado");
CHfiguras.addItem("Círculo");
CHfiguras.addItem("Rectángulo");
CHfiguras.addItem("Triángulo");

PNnorte.add(CHfiguras);
PNnorte.add(sColoresFondo);
PNnorte.add(sColoresTexto);

PNsur.add(BTarriba);
PNsur.add(BTabajo);
PNsur.add(BTizquierda);
PNsur.add(BTderecha);
PNsur.add(BTaumentar);
PNsur.add(BTdisminuir);

add("North",PNnorte);
add("South",PNsur);
}

public static void main (String args[]){

new mueveCosasDibujables();
}


}


eje01 es el package que incluye los ejercicios de la primera unidad y sColor es una extensión de la clase Choice que lo que hace es añadir el título del choice (que lo recibe en el primer parametro) y los componentes que sean colores en el Choice (que lo recibe en el segundo parametro al construirlo) y devolver los colores como objetos Color cuando los seleccionas.

El problema es que los componentes gráficos únicamente se dibujan por pantalla cuando intento modificar el tamaño del frame (hago click en los laterales o la barra de título), o cuando lo modifico (con el cursor, no desde código).

Gracias de antemano,

Un saludo.

Leyer

Bueno unieras colocado el code faltante.

Solo puedo decir

1.Se sebe estar generando una exepcion en la clase faltante.

2.Es habitual colocar los métodos de visibilidad y localización, luego de haber agregado todos los componentes.

Un saludo.

-Localhost-

Hola, gracias por responder,

sColor no produce ninguna excepción, su código es éste:
Código (java) [Seleccionar]
package eje01;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class sColor extends Choice {

Vector listaColores= new Vector();

public sColor(String primerItem, String[] colores){

if(!primerItem.equals("") && !primerItem.equals(null)){

this.addItem(primerItem);
} else {
this.addItem("Selecciona un color");
}

for(int n=0;n<colores.length;n++){

Color color= leerColor(colores[n]);

if(color!=null && noRepetido(colores[n])){

this.addItem(colores[n].toString());
listaColores.add(colores[n].toString());
}
}
}

public boolean noRepetido(String color){

for (int n=0;n<listaColores.size();n++){

if(listaColores.get(n).toString().equalsIgnoreCase(color)){

return false;
}
}

return true;
}

public static Color leerColor(String color){

Color colorResultado=null;
String colores[] = {"negro","azul","cyan","gris oscuro","gris","verde","gris claro","magenta","naranja","rosa","rojo","blanco","amarillo"};
int identificadorColor=colores.length;

for (int n=0;n<colores.length;n++){

if(color.toLowerCase().equals(colores[n])){

identificadorColor=n;
n=colores.length;}
}

switch(identificadorColor){

case 0: colorResultado = Color.black;
break;
case 1: colorResultado = Color.blue;
break;
case 2: colorResultado = Color.cyan;
break;
case 3: colorResultado = Color.darkGray;
break;
case 4: colorResultado = Color.gray;
break;
case 5: colorResultado = Color.green;
break;
case 6: colorResultado = Color.lightGray;
break;
case 7: colorResultado = Color.magenta;
break;
case 8: colorResultado = Color.orange;
break;
case 9: colorResultado = Color.pink;
break;
case 10: colorResultado = Color.red;
break;
case 11: colorResultado = Color.white;
break;
case 12: colorResultado = Color.yellow;

}

return colorResultado;
}
}


Es algo que tiene que ver con lo segundo porque modifiqué eso y se vio la parte de arriba únicamente, luego le agregué un "pack();" y ahora se ven todos los componentes correctamente, pero "center" quiero que ocupe más espacio, apenas ocupa un par de píxeles, sabes como podría hacerlo más grande? probé con introducirle un panel y ponerle setSize(360,360); pero ni aún así.  No sé si habrá una manera mejor que pack, yo lo preferiría porque pack() no me deja modificar el tamaño inicial del Frame. Adjunto el código modificado:

Código (java) [Seleccionar]
import java.awt.*;
import eje01.*;

public class mueveCosasDibujables extends Frame {



private String colores[] =  {"negro","azul","cyan","gris oscuro","gris","verde","gris claro","magenta","naranja","rosa","rojo","blanco","amarillo"};
private String[] coloresFondo= colores,coloresTexto = colores;


private Button BTarriba= new Button("arriba"),
      BTabajo= new Button("abajo"),
      BTizquierda= new Button("izquierda"),
      BTderecha= new Button ("derecha"),
      BTaumentar= new Button("aumentar"),
      BTdisminuir= new Button("disminuir");

private Choice CHfiguras = new Choice();
private sColor sColoresFondo= new sColor("Color de fondo",coloresFondo),sColoresTexto = new sColor("Color del texto",coloresTexto);

private GridLayout GLnorte = new GridLayout(1,3), GLsur = new GridLayout(1,6);
private Panel PNnorte = new Panel(), PNsur = new Panel(),PNcentro= new Panel();

public mueveCosasDibujables() {

setLayout(new BorderLayout());

CHfiguras.addItem("Selecciona figura");
CHfiguras.addItem("Cuadrado");
CHfiguras.addItem("Círculo");
CHfiguras.addItem("Rectángulo");
CHfiguras.addItem("Triángulo");

PNnorte.setLayout(GLnorte);
PNnorte.add(CHfiguras);
PNnorte.add(sColoresFondo);
PNnorte.add(sColoresTexto);

PNsur.setLayout(GLsur);
PNsur.add(BTarriba);
PNsur.add(BTabajo);
PNsur.add(BTizquierda);
PNsur.add(BTderecha);
PNsur.add(BTaumentar);
PNsur.add(BTdisminuir);

add("North",PNnorte);
add("South",PNsur);
add("Center",PNcentro);

setVisible(true);
setLocation(500,200);
setSize(400,400);
pack();


}

public static void main (String args[]){

new mueveCosasDibujables();
}


}


Un saludo y gracias de antemano.

Leyer

si lo colocas asi debería acomodarse

   
Código (java) [Seleccionar]
pack();
setSize(400,400);


o setPreferredSize(new Dimension(500,500));

-Localhost-

Lo intenté pero lo que coloqué en "South" (es decir el PNsur) se queda el mismo lugar en el que se encontraba antes de redimensionar el Frame, es decir lo único que hace colocar primero el pack(); y luego el setSize, es crecer la ventana, pero no separar los componentes y hacer espacio en el centro.

Y setPreferredSize(Dimension d) sólo sirve en los JFrame y tengo que hacerlo con Frame.
________________________EDITO_____________________________________

Lo solucioné poniendo el setSize() antes de definir el layout el setVisible() y cualquier cosa (de hecho lo puse inmediatamente después de super(""); xD) es decir:
Código (java) [Seleccionar]

public mueveCosasDibujables() {

super("Dibujador de cosas");
setSize(400,400);
setLayout(new BorderLayout());


No pongo el code completo porque ahora mismo es un poco más largo que antes, y pa no liar jeje. (y da errores por todos lados el muy desgraciado... xD).

Muchas gracias LEYER por tus respuestas =D. Dejé un comentario esta mañana en un post de tu blog, me da errores al compilar el código que subiste como reto para que la gente crackease en java, no sé si está revisado ese código (? xD no sé :S).

Un saludo.

Leyer