Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con controles Swing

Estas en el tema de Problema con controles Swing en el foro de Java en Foros del Web. Soy nuevo en este foro, y me gustaría iniciar compartiendo un problema, que no se si sea típico o no, en fin... Estoy desarrollando una ...
  #1 (permalink)  
Antiguo 26/09/2011, 17:25
 
Fecha de Ingreso: septiembre-2011
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Problema con controles Swing

Soy nuevo en este foro, y me gustaría iniciar compartiendo un problema, que no se si sea típico o no, en fin...

Estoy desarrollando una aplicación en Java (una Calculadora científica con algunos extras) con interfaz gráfica en Java, utilizando específicamente Swing y AWT, la aplicación compila correctamente pero, al cargar los botones algunos de ellos no cargan correctamente ( a veces si lo hacen, a veces no)... y no es hasta que paso el cursor sobre ellos que aparecen, al principio pensé que el problema era el editor (estaba utilizando JCreator) pero intente con Netbeans y Eclipse y el problema persiste, supongo que el problema será que la aplicación tiene muchos botones. Ahora bien, mi pregunta es ¿Hay alguna solución para este problema?, ¿Estaré cargando bien mis botones?

Los botones están sobre Paneles (JPanel) y estos a su vez estan sobre un Contenedor general que se adapta al frame.

Como información adicional, no creo los botones utilizando la clase JButton, si no, utilizando una clase que hereda de JButton (para evitar tener que asignar propiedades a todos), no sé si tenga algo que ver

Desde ya, gracias por responder.

Saludos.

PD. dejo unas imágenes de la aplicación ejecutándose en 3 diferentes ocasiones.

[URL="http://dnns.zobyhost.com/images/Calculadora3.png"]Primera ejecución[/URL]
[URL="http://dnns.zobyhost.com/images/Calculadora2.png"]Segunda[/URL]
[URL="http://dnns.zobyhost.com/images/Calculadora.png"]Tercera[/URL]

Última edición por Dnns16; 27/09/2011 a las 21:01
  #2 (permalink)  
Antiguo 27/09/2011, 21:01
 
Fecha de Ingreso: septiembre-2011
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con controles Swing

respuesta?
  #3 (permalink)  
Antiguo 28/09/2011, 07:04
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Problema con controles Swing

Muéstranos el código que estas usando.
  #4 (permalink)  
Antiguo 29/09/2011, 08:49
 
Fecha de Ingreso: septiembre-2011
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con controles Swing

Cita:
Iniciado por Ronruby Ver Mensaje
Muéstranos el código que estas usando.
esta es mi clase interfaz

Código:
/*

package calculadora;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Listener extends Matematica implements ActionListener{
    public void actionPerformed(ActionEvent e){
        }
} 

class BotonImagen extends JButton {
	public BotonImagen(String imagen){
            ImageIcon icono = new ImageIcon(getClass().getResource(imagen+".gif"));
            Insets sinmargen = new Insets(0,0,0,0); 
            setIcon(icono);		
            setMargin(sinmargen);
            setFocusable(false); 
            Listener listener = new Listener();
            addActionListener(listener);
            setActionCommand(imagen);
	}	
}		
class Ventana extends JFrame{
    Ventana(){
	setLocation(300, 100);
        setSize(375, 357);
        setTitle("Calculadora");
        setLayout(null); //Alineación de botones
        setDefaultCloseOperation(Ventana.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }
}

class Boton extends JButton {
	public Boton(String txtBoton, int x, int y, int ancho, int alto){
        Insets sinmargen = new Insets(0,0,0,0);  	 
       	setBounds(x,y,ancho,alto);
        setText(txtBoton);
       	setMargin(sinmargen);
        setFont(fntBotones);
        Listener listener = new Listener();
       	addActionListener(listener);
        }
}
	
class Contenedor extends JPanel {
	Contenedor(int x, int y, int ancho, int alto){
            setBorder(BorderFactory.createEtchedBorder());
            setBounds(x, y, ancho, alto);
            setLayout(null);
	}
}

class RadioClick extends Matematica implements ActionListener{
   	public void actionPerformed (ActionEvent e){
     
  	}
}

class Interfaz {
    
    void dibujarVentana(){
        System.out.println("dibujando ventana...");
        Ventana ventana = new Ventana();
        Font fntLabel1 = new Font("Arial Narrow",Font.ITALIC,12);
        Font fntLabel2 = new Font("Arial Narrow",Font.PLAIN,25);
        //-------------------------Fuentes--------------------------------
        
        //-----------------------Contenedores-----------------------------
        Container cnt = ventana.getContentPane(); 

        Contenedor botones = new Contenedor(5,80,361,245);
        cnt.add(botones);

        Contenedor labels = new Contenedor(5,5,360,70);
        labels.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        cnt.add(labels);
        
	Contenedor tiposDatos = new Contenedor(10,10,155,40);
	tiposDatos.setLayout(new GridLayout(1, 2));
        botones.add(tiposDatos);
        
        Contenedor btnMemoria = new Contenedor(170,10,181,40);
        botones.add(btnMemoria);
        
        Contenedor btnOp1 = new Contenedor(10,55,120,180);
        botones.add(btnOp1);        
        
        Contenedor btnNum = new Contenedor(140,55,120,180);
        botones.add(btnNum);
        
        Contenedor btnOp2 = new Contenedor(270,55,80,180);
        botones.add(btnOp2);
        //-----------------------Contenedores-----------------------------
        
	//--------------------------Labels--------------------------------
	//Label lblOperacion = new Label();
	lblOperacion = new Label();
        lblOperacion.setText("");
        lblOperacion.setBounds(1, 1, 358, 20);
        lblOperacion.setBackground(Color.WHITE);
        lblOperacion.setAlignment(Label.RIGHT);
        lblOperacion.setFont(fntLabel1);
        labels.add(lblOperacion);
        
        //Label lblNumero = new Label();
        lblNumero = new Label();
        lblNumero.setText("0");
        lblNumero.setBounds(1, 21, 358, 48);
        lblNumero.setBackground(Color.WHITE);
        lblNumero.setAlignment(Label.RIGHT);
        lblNumero.setFont(fntLabel2);
        labels.add(lblNumero);
       
	//--------------------------Labels--------------------------------
		
	//--------------------------Botones-------------------------------
		
	//botones de memoria
	cmdMC = new Boton("MC",5,5,30,30);        
        cmdMC.setForeground(Color.BLUE);
        
        cmdMR = new Boton("MR",40,5,30,30);        
        cmdMR.setForeground(Color.BLUE);
           
        cmdMS = new Boton("MS",75,5,30,30);
        cmdMS.setForeground(Color.BLUE);
        
        cmdMPlus = new Boton("M+",110,5,30,30);      
        cmdMPlus.setForeground(Color.BLUE);
                
        cmdMLess = new Boton("M-",145,5,30,30);
        cmdMLess.setForeground(Color.BLUE);
        
        btnMemoria.add(cmdMC);
        btnMemoria.add(cmdMR);
        btnMemoria.add(cmdMS);
        btnMemoria.add(cmdMPlus);
        btnMemoria.add(cmdMLess);
        
        //botones numericos
        cmd0 = new Boton("0",5,145,70,30);
        btnNum.add(cmd0);
         
        cmd1 = new Boton("1",5,110,30,30);
        btnNum.add(cmd1);
        
        cmd2 = new Boton("2",45,110,30,30);
        btnNum.add(cmd2);
        
        cmd3 = new Boton("3",85,110,30,30);
        btnNum.add(cmd3);
        
        cmd4 = new Boton("4",5,75,30,30);
        btnNum.add(cmd4);
        
        cmd5 = new Boton("5",45,75,30,30);
        btnNum.add(cmd5);
        
        cmd6 = new Boton("6",85,75,30,30);
        btnNum.add(cmd6);
        
        cmd7 = new Boton("7",5,40,30,30);
        btnNum.add(cmd7);
        
        cmd8 = new Boton("8",45,40,30,30);
        btnNum.add(cmd8);
        
        cmd9 = new Boton("9",85,40,30,30);
        btnNum.add(cmd9);
        
        cmdPunto = new Boton(".",85,145,30,30);
        btnNum.add(cmdPunto);
        
        //botones de borrado
        cmdRetro = new BotonImagen("retro");
        cmdRetro.setBounds(5,5,30,30);
        btnNum.add(cmdRetro);
        
        cmdCE = new BotonImagen("CE");
        cmdCE.setBounds(45,5,30,30); 
        btnNum.add(cmdCE);
        
        cmdC = new BotonImagen("C");      
        cmdC.setBounds(85,5,30,30);
        btnNum.add(cmdC);
        
        //botones de Operacion 
        cmdLn = new Boton("Ln",5,5,30,30);
        cmdSin = new Boton("Sin",5,40,30,30);
        cmdCos = new Boton("Cos",5,75,30,30);   
        cmdTan = new Boton("Tan",5,110,30,30);
        cmdMod = new Boton("Mod",5,145,30,30);       
        cmdLog = new Boton("log",45,145,30,30);
        cmdFact = new Boton("n!",85,5,30,30);
        	
        cmdExponencial = new BotonImagen("exponencial");
        cmdExponencial.setBounds(45,5,30,30); 
        
        cmdCuadrado = new BotonImagen("cuadrado");
        cmdCuadrado.setBounds(45,40,30,30); 
        
        cmdCubo = new BotonImagen("cubo");
        cmdCubo.setBounds(45,75,30,30); 
        
        cmdPotencia = new BotonImagen("potencia");
        cmdPotencia.setBounds(45,110,30,30); 
        
        
        //botones de operacion c/imagen
        cmdRaiz = new BotonImagen("raiz");
        cmdRaiz.setBounds(85,40,30,30);
        
        cmdRaizC = new BotonImagen("raizC");
        cmdRaizC.setBounds(85,75,30,30);
        
        cmdRaizN = new BotonImagen("raizN");
        cmdRaizN.setBounds(85,110,30,30);
        
        cmdBase10 = new BotonImagen("base10");
        cmdBase10.setBounds(85,145,30,30);
        
        //boton de operacion 2
        cmdSigno = new Boton("±",5,5,30,30);
        
        cmdDiv = new Boton("/",4,40,30,30);
        
        cmdMulti = new Boton("*",5,75,30,30);
           
        cmdResta = new Boton("-",5,110,30,30);
        
        cmdSuma = new Boton("+",5,145,30,30);

        
        
        
        cmdShift = new Boton("^",45,4,30,30);
        
        cmdE = new Boton("e",45,40,30,30);
        
        cmdPi = new Boton("Pi",45,75,30,30);
           
        cmdIgual = new Boton("=",45,110,30,65);
        
     	//botones de tipos
     	grad = new JRadioButton("Grad",true);
     	RadioClick listener = new RadioClick(); 
     	grad.addActionListener(listener);
     	
     	rad = new JRadioButton("Rad",false);
     	rad.addActionListener(listener);
     	
     	ButtonGroup grupoOp = new ButtonGroup();
     	grupoOp.add(grad);
     	grupoOp.add(rad);
     	
     	tiposDatos.add(grad);
     	tiposDatos.add(rad);
     	
        btnOp1.add(cmdLn);
        btnOp1.add(cmdSin);
        btnOp1.add(cmdCos);
        btnOp1.add(cmdTan);
        btnOp1.add(cmdMod);
        btnOp1.add(cmdExponencial);
        btnOp1.add(cmdCuadrado);
        btnOp1.add(cmdCubo);
        btnOp1.add(cmdPotencia);
        btnOp1.add(cmdLog);
        btnOp1.add(cmdFact);
        btnOp1.add(cmdRaiz);
        btnOp1.add(cmdRaizC);
        btnOp1.add(cmdRaizN);
        btnOp1.add(cmdBase10);
        
        btnOp2.add(cmdSigno);
        btnOp2.add(cmdDiv);
        btnOp2.add(cmdMulti);
        btnOp2.add(cmdResta);
        btnOp2.add(cmdSuma);
        btnOp2.add(cmdShift);
        btnOp2.add(cmdE);
        btnOp2.add(cmdPi);
        btnOp2.add(cmdIgual);
        
        System.out.println("fin del dibujado");
    }
}
Clase Principal Calculadora

Código:
package calculadora;

/**
 *
 * @author dennis
 */
public class Calculadora {
    public static void main(String[] args) {
        Interfaz calc = new Interfaz();
        calc.dibujarVentana();
    }
    
}
Como pueden ver para posicionar los controles utilicé setBounds, pero utilizando un gridlayout o floatlayout tambien tengo el mismo problema, no se que pueda ser

PD. gracias por responder
  #5 (permalink)  
Antiguo 29/09/2011, 19:09
 
Fecha de Ingreso: septiembre-2011
Mensajes: 5
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con controles Swing

me respondo a mi mismo:

El problema era algo tonto (por decirlo así), y era que, el método crea el objeto Ventana visible y luego carga los controles entonces la aplicación se muestra antes de haber cargado todo. la solución fue colocar el ventana.setVisible(true) al final de el método dibujarVentana().
sencilla aunque fue un poco difícil darse cuenta.

Etiquetas: controles, netbeans, swing
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:14.