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

Peroblema al borrar JtextFields de un Panel

Estas en el tema de Peroblema al borrar JtextFields de un Panel en el foro de Java en Foros del Web. Buenas a todos gracias por entrar. Estoy introduciendome en el mundo del AWT de java, haciendo un programa que dado un sudoku lo resuelva :) ...
  #1 (permalink)  
Antiguo 03/07/2011, 10:32
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Peroblema al borrar JtextFields de un Panel

Buenas a todos gracias por entrar.
Estoy introduciendome en el mundo del AWT de java, haciendo un programa que dado un sudoku lo resuelva :) (intentandolo ya que esa parte aun no esta XD ).

Quiero poner un boton que borre el sudoku y ponga todas las casilla a "-" , pero no veo manera de hacerlo. podeis hecharme una mano por favor? adjunto el codigo poniendo en negro el codigo del boton BORRAR. Habia pensado eliminar con remove el panel p o hacer un removeAll sobre p para quitar las "casillas" y luego volver a ponerlas, pero no funciona, se me queda sin opcion a clickarlas.


package calc;

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


public class aplicacion extends JFrame implements ActionListener {

private JTextField t;
String labelTexts[] = {"-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-",
"-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-", "-","-","-","-","-","-","-","-","-",
"-","-","-","-","-","-","-","-","-"} ;
JPanel p = new JPanel();
JPanel cp = (JPanel) this.getContentPane();

public aplicacion() {
super("Sudoku Finish 0.1");
String labelButtons[] = {"Resolver", "Borrar"};
JPanel cp = (JPanel) this.getContentPane();
// cp.setLayout(new BorderLayout());
// JPanel p = new JPanel();
p.setLayout(new GridLayout(10,9));
//Numeros del Sudoku
for (int i = 0; i < labelTexts.length; ++i) {
JTextField casilla = new JTextField(labelTexts[i]);
//casilla.addActionListener(this);



casilla.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent e)
{
// System.out.println("Perdido foco");
// System.out.println(((JTextField)e.getSource()).get Text());
String s = ((JTextField)e.getSource()).getText();
char ar[] = s.toCharArray();

if ((ar[0] != '-'))
{
if ((ar[0] == '1') || (ar[0] == '2') || (ar[0] == '3') || (ar[0] == '4') || (ar[0] == '5') || (ar[0] == '6') || (ar[0] == '7') || (ar[0] == '8') || (ar[0] == '9'))
{
((JTextField)e.getSource()).setText(s);
t.setText("Numero Introducido Correctamente");
}
else
{
((JTextField)e.getSource()).setText("-");
t.setText("Error al introducir un numero");
}
}
else
{
((JTextField)e.getSource()).setText("-");
t.setText("Error al introducir un numero");
}

}

public void focusGained(FocusEvent e) {
// No hacemos nada
}
});

p.add(casilla);



}
JPanel pz = new JPanel();
//Botones del sudoku
for (int i = 0; i < labelButtons.length; ++i) {
JButton button = new JButton(labelButtons[i]);
button.addActionListener(this);
pz.add(button);
}
t = new JTextField();
t.setHorizontalAlignment(JTextField.RIGHT);
t.setText("0");
cp.add(t, BorderLayout.PAGE_START);
cp.add(p, BorderLayout.CENTER);
cp.add(pz, BorderLayout.SOUTH);
this.setSize(500, 500);
this.setVisible(true);
this.setDefaultCloseOperation(aplicacion.EXIT_ON_C LOSE);






}

public static void main(String[] args) {
new aplicacion();
}





public void actionPerformed(ActionEvent e) {
char c = ((JButton) e.getSource()).getText().charAt(0);
switch (c)
{
case 'B':
t.setText("Sudoku Borrado con Exito");
cp.remove(p);
cp.validate();

break;



}


// System.out.print(" ");

}
}
  #2 (permalink)  
Antiguo 04/07/2011, 13:09
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

alguna idea? he probado quitando visibilidad y volviendosela a poner y demas, pero no consigo nada :(
  #3 (permalink)  
Antiguo 04/07/2011, 22:10
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 3 meses
Puntos: 188
Respuesta: Peroblema al borrar JtextFields de un Panel

Lo que debes hacer es en el metodo que uses para poner todas las casillas "-"
tienes que recorrer el arreglo[filas][columnas] y a cada indice (i,j) en por ejemplo arreglo[i][j] hacer

casilla[i][j].setText("-");
casilla[i][j].setBackground(Color.WHITE); // Si los quieres pintar a blanco
.
.
.

etc...
Y todo tipo de propiedades que desees que tengan tus casillas.
_______________________________________________-


donde casilla es un arreglo de objetos del tipo que desees por ejemplo botones

JButton[][] casilla = new JButton[dimension][dimension] // Donde dimension es el numero de filas o columnas

Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #4 (permalink)  
Antiguo 05/07/2011, 16:55
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

muchas gracias new, ya he implementado el cambio y funciona perfectamente. Tiene narices que no pensara en hacer un array y tuviera en mente usar una lista de punteros, madre mia ^^!

Por lo demas he aprovechado para mejorar algunas funciones de verificacion de datos y he creado una matriz tableroAux para hacer las futuras operaciones en el, ya que seran mas faciles sobre ella.

Os dejo el codigo por si os interesa :D

Código:
package calc;

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


public class aplicacion extends JFrame implements ActionListener {

	
	
    private JTextField t;
    JPanel p = new JPanel();
    JPanel cp = (JPanel) this.getContentPane();
    JTextField[][] tablero = new JTextField[9][9];
    //tableroAux no tendra - sino que al ser int usara el 0 como referencia
    int [][] tableroAux = new int[9][9]; 

    
    
    public aplicacion() {
        super("Sudoku Finish 0.1");
        String labelButtons[] = {"Resolver", "Borrar"};
        cp.setLayout(new BorderLayout());
        p.setLayout(new GridLayout(10,9));
        //Casillas del sudoku
        for (int i = 0; i < 9; i++) {
        	
          for (int j = 0; j < 9; j++) {

        	tablero[i][j] = new JTextField();
            tablero[i][j].setText("-");
            tableroAux[i][j]=0;


          System.out.println("hola"+i+j);
           
            tablero[i][j].addFocusListener(new FocusListener()
            {
            	   public void focusLost(FocusEvent e) 
            	   {
            	      String s = ((JTextField)e.getSource()).getText();
            	      char ar[] = s.toCharArray();
            	      
            	      if ((ar[0] != '-'))
            	      {
            	      if (((ar[0] == '1') || (ar[0] == '2')  || (ar[0] == '3') || (ar[0] == '4') || (ar[0] == '5') || (ar[0] == '6') || (ar[0] == '7') || (ar[0] == '8') || (ar[0] == '9')) && (ar.length == 1))
            	      	{
            	    	  ((JTextField)e.getSource()).setText(s);
            	          t.setText("Numero Introducido Correctamente");
            	      	}
            	      else
            	      { 
            	    	((JTextField)e.getSource()).setText("-");
            	        t.setText("Error al introducir un numero");
            	      } 
            	     }
            	      else
            	      {
              	    	((JTextField)e.getSource()).setText("-");
            	        t.setText("Error al introducir un numero");  
            	      }
            	     
            	   }
            	   
            	   public void focusGained(FocusEvent e) {
            	      // No hacemos nada
            	   }
            });
            
            p.add(tablero[i][j]);
            
          }  
            
        }
        
        
        JPanel pz = new JPanel();
        //Botones del sudoku
        for (int i = 0; i < labelButtons.length; ++i) {
            JButton button = new JButton(labelButtons[i]);
            button.addActionListener(this);
            pz.add(button);
        }
        
        //cuadro de texto informativo
        t = new JTextField();
        t.setHorizontalAlignment(JTextField.RIGHT);
        t.setText("0");
        cp.add(t, BorderLayout.PAGE_START);
        cp.add(p, BorderLayout.CENTER);
        cp.add(pz, BorderLayout.SOUTH);
        this.setSize(500, 500);
        this.setVisible(true);
        this.setDefaultCloseOperation(aplicacion.EXIT_ON_CLOSE);
        
        
        
        
        
        
    }

    public static void main(String[] args) {
        new aplicacion();
    }

    

    
    
    public void actionPerformed(ActionEvent e) {
        char c = ((JButton) e.getSource()).getText().charAt(0);
        switch (c)
        {
           case 'B':
        	   
        	   //bucle doble FOR para cambiar el valor tanto de tableroAux como de tablero normal
        	   for (int i=0; i<9; i++ )
        	   {
        		   for (int j=0; j<9; j++ )
            	   {
        			  tableroAux[i][j]=0;
        			  tablero[i][j].setText("-");
            	   }
        	   }
        	   t.setText("Sudoku Borrado con Exito");
        	   break;
                    
                    
         }
        

      //  System.out.print(" ");
   
    }
}
  #5 (permalink)  
Antiguo 06/07/2011, 08:33
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

Sigo mejorando mi programa, poco a poco pero sin pausas jeje.

Me he encontrado con un problema al crear un metodo que verifique, al perder el foco una casilla (JTextField) que no hay numeros repetidos en esa fila. El metodo se llama verificarFila(int i, int j) donde i j son las coordenadas dentro de la matriz.

El problema reside en que no se que casilla llama al focust lost, no tengo sus coordenadas.
Habia pensado usar una o dos matrices de enteros auxiliares (en una meto los datos y cada vez que introduzco un nuevo dato copio esta a otra auxiliar y busco la casilla direfente ) pero me parecia una solucion un poco pesada.

Es posible saber que casilla me llama ( por ejemplo la casilla[3][1] ) son hacer grandes cosas?
  #6 (permalink)  
Antiguo 06/07/2011, 10:02
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 3 meses
Puntos: 188
Respuesta: Peroblema al borrar JtextFields de un Panel

Hola.


Estas haciendo esto en la definicion de tus casillas:
Código java:
Ver original
  1. JTextField[] casilla = new JTextField[dimension];
  2. ..
  3. ..
  4. ..
  5. ..
  6. casilla[0].addFocusListener(this);
  7. casilla[1].addFocusListener(this);
  8. casilla[2].addFocusListener(this);

Cada casilla tiene su propio escuchador de Focus.

Es esto lo que buscas?
Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #7 (permalink)  
Antiguo 06/07/2011, 10:28
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

si y no, creo. Supongamos que casilla[3][4] pierde el focus y te avisa de que han escrito un 4 en ella, e sdecir sucede un evento sobre un JtextField pero no se cual. Tengo opcion de saber en ese momento cual es su fila y columna? LA unica opcion que me ha ocurrido es tener un array de enteros auxiliar, y comparar uno a uno con el array de casilla[][] para ver la diferencia, es decir la casilla en la que se ha escrito, pero hacer eso me parece feo, por eso pregunto si hay una opcion mas limpia.

En concreto la forma de buscarlo seria seguramente un doble bucle while con la condicion ( casilla[a][b] != tableroAux [a] [b] )

Última edición por Rymura; 06/07/2011 a las 10:40
  #8 (permalink)  
Antiguo 06/07/2011, 10:43
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 3 meses
Puntos: 188
Respuesta: Peroblema al borrar JtextFields de un Panel

Supongamos que tienes 3 areas de texto llamadas casillas. Cada casilla tiene su escuchador de eventos, y si alguna de ellas pierde el focus llama a su metodo escuchador, Aqui lo que buscas, si bien entiendo es sabe cual de las casillas fue la que perdió el focus.

Esto ya esta implementado en el método

Código java:
Ver original
  1. public void focusLost( FocusEvent e ){
  2.  
  3.  
  4. }

donde con e puede determinar cual area de texto fue la que pediro el focus.

de ésta manera:

Código java:
Ver original
  1. $varialbe = e.getComponent();
  2.  
  3. if($variable.getName().equals("Area_de_texto_1")){
  4.  
  5. // El area de texto 1 fue la que perdio el foco
  6.  
  7.  
  8. }
  9.  
  10. else if($variable.getName.equals("Area_de_texto_2")){
  11.  
  12. // El area de texto 2 fue la que perdio el foco
  13.  
  14. }

TE dejo un link que te va a servir mucho.

http://www.fismat.umich.mx/computaci...1/cap11-7.html

Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #9 (permalink)  
Antiguo 07/07/2011, 04:13
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

Muchas gracias New eso es exactamente lo que andaba buscando, una forma facil de identificar el JTextfield. No sabia que se podia asignar un nombre, en los documentos que me habia bajado por internet no aparecia.

Lo que he hecho ahora ha sido asignar el nombre ij donde i es la fila y j la columna, de tal manera que cuando se produce un evento, recojo el nombre, lo convierto a un array char y cojo los numeros facilmente :D

Voy a acabar unas funciones de verificacion y luego si eso copio el codigo por si alguien mas quiere verlo :D
  #10 (permalink)  
Antiguo 13/07/2011, 06:31
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

Bueno tal y como dije en el comentario anterior, aqui os dejo el programa que resuelve sudokus
De momento y a falta de pruebas mas concretas y eliminar algun fallito, resuelve sudokus facilitos :D Proximamente le pondre un par de cosas mas que faltan pero como lo acabo de acabar y ha funcionado he ido corriendo a publicarlo jeje.

Gracias a next por ayudarme en el proceso de la interfaz.

Espero que os guste :)

SudokuFinish v1.0 ---> http://www.megaupload.com/?d=T2UYAQK4
  #11 (permalink)  
Antiguo 13/07/2011, 08:13
 
Fecha de Ingreso: diciembre-2010
Mensajes: 459
Antigüedad: 14 años
Puntos: 21
Respuesta: Peroblema al borrar JtextFields de un Panel

Rymura buen detalle al compartir tu codigo de sudoku por si alguien lo necesita

Saludos
  #12 (permalink)  
Antiguo 13/07/2011, 11:57
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 17 años, 3 meses
Puntos: 188
Respuesta: Peroblema al borrar JtextFields de un Panel

muchas gracias por compartir tu programa. +1

Si pudieras compartir el codigo fuente, ya eso es lo que realmente nos gusta ver.


Saludos :D
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #13 (permalink)  
Antiguo 13/07/2011, 12:48
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

Cita:
Iniciado por New Ver Mensaje
muchas gracias por compartir tu programa. +1

Si pudieras compartir el codigo fuente, ya eso es lo que realmente nos gusta ver.


Saludos :D
En unos dias pondre el fuente, como os he comentado aun esta en pruebas :D cuando verifique que no comete errores y cambie unas cosillas sera vuestro para que lo mejoreis jeje.

Por cierto, alguno sabe como subirlo a un movil symbian? he probado directamente suibendo el .jar pero no funciona

Última edición por Rymura; 13/07/2011 a las 13:14
  #14 (permalink)  
Antiguo 14/07/2011, 01:33
 
Fecha de Ingreso: diciembre-2010
Mensajes: 459
Antigüedad: 14 años
Puntos: 21
Respuesta: Peroblema al borrar JtextFields de un Panel

1.-Hay que pasar los archivos.. .jar, .sis, .sisx a la memoria del telefono (interna o externa..), ya sea por almacenamiento masivo o con el nokia pc suite que lo teneis en el cd que viene con el movil o en este enlace :
http://www.nokia.es/soporte/software/pcsuite/descarga
Acordaos que teneis elegir vuestro movil al descargar el pc suite


2.-Pues buscas los ficheros que habeis pasado a la memoria del telefono (por ejemplo con el gestor de archivos) y le dais dos clicks en ella y se instalará con un sencillo paso...eligiendo la memoria donde quereis instalarlo, la interna o la externa...

PD: un post que lei de internet:
http://www.nokiamania.es/showthread.php?t=405

Saludos
  #15 (permalink)  
Antiguo 14/07/2011, 17:32
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

Bueno lo prometido es deuda. Aqui el programita en cuestion! he solucionado algun fallo que impedia y daba algun error tonto (lo que pasa al confundir un "<" por un "<=" ^^ )

SudokuFinish v1.2
http://www.megaupload.com/?d=4ROHYIMA


Adjunto: ejecutable de la version 1.2 + codigo fuente (proyecto exportado de eclipse) + ejemplos de sudokus que funcionan + ejemplo de sudoku fallido. Para los sudokus he usado la pagina http://www.sudoku-online.org/ y ha fallado al primer sudoku dificil ( no es que falle, esque no esta implementado una solucion mejor y no pone todos los numeros). Para estos mas dificiles habia pensado quiza tirar por un Backtraking o seleccion optima, pero deberia leer sobre ello ya que nunca he usado recursividad con Java y no se como funcionaria.

Como vereis si alguno lo toquetea y mira un poco, el codigo no es muy limpio (es la primera vez que hago algo asi ^^ ) como por ejemplo la declaracion de arrays que ocupa muchisimo.
Faltaria crear el metodo ColocarCuadrado(int fila, int columna) que desarrollare para la semana q viene o asi, por si alguno se anima (seria similar a verificarCuadrado).

Cualquier duda, fallo, critica, agradecimiento o similar, será totalmente bien recibido, lo que queremos es mejorar poco a poco todos :D un saludete.

pd: sirdaiz he intentado copiar el .jar al movil pero no funciona, no lo instala y no se ejecuta.
  #16 (permalink)  
Antiguo 21/07/2011, 04:35
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

sigo avanzando con mi programa.
He creado un metodo recursivo que solucione el sudoku desde donde lo dejo con "mi metodo" (es decir pongo todos los numeros faciles y luego uso fuerza bruta).

Este es el codigo, solo pongo el metodo porque lo demas es exactamente igual, no lo he tocado

Código:
        
    /**
     * Algotirmo recursivo para la solucion del sudoku. Se aplica despues de intentar solucionarlo del otro modo.
     * @param fila donde vamos a intentar colocar el numero
     * @param columna donde vamos a intentar colocar el numero
     */

    //Debemos usar otro tablero para guardarlo como base. Se llamara tableroParcial
    public boolean solve(int fila, int columna)
	  {
      boolean repetido;
      for (int i = 1; i < 10; i++)
		{
    	  //comprobamos que donde vayamos a colocar no haya un numero ya fijo  
    	  // Si lo hay, pasamos a la siguiente casilla
    	  if (tableroParcial[fila][columna] != 0)
    	  {
    		  if (columna <8) 
					columna++;
				else
				{
					columna = 0;
					fila++;
				}
           if (solve(fila, columna) )
			   {
               return true;
			   }
           else return false;
    	  }
    	  //si no es uno fijo de tableroParcial procedemos a ver si se puede colocar
    	  else
    	  {
      		String numero = i + "";
      		tablero[fila][columna].setText(numero);
		  repetido =  verificarColumna(fila,columna) || verificarFila(fila, columna) || verificarCuadrado(fila, columna);
		  if ( !repetido )
		  { 
					// int valor = tableroAux[fila][columna];
					tableroAux[fila][columna]= i;
          if (puestos < 81) 
			{
				puestos++;
				System.out.print(puestos);
				if (columna <8) 
					columna++;
				else
				{
					columna = 0;
					fila++;
				}
             if (solve(fila, columna) )
			   {
                 return true;
              } 
				else
				{
					  tableroAux[fila][columna] = tableroParcial[fila][columna];
					  puestos--;
					  System.out.print("a");
              }
          } 
			else 			
             return true;           
        }
		  else
		  {
			numero = 0 + "";
	      	tablero[fila][columna].setText(numero);
		  }
		}
      }
      return false;
    }

El problema es que mi codigo NO FUNCIONA. Os explico:
es un metodo backtracking, es decir coloca numero a numero hasta dar con la solucion, desde la casilla (0,0) a la (8,8), recordemos que son indices de java.

El fallo lo produce cuando no puede colocar ningun numero en una casilla (exactamente cuando coloca el numero 54, podeis verlo en la consola, es el [2][5] hace un return false y desde hay va hacia atras, no consigo que funcione y vuelva a hacer cambios hacia delante.

Si veis el codigo, nada mas empezar hay una pequeña criba para no poner numeros en las casillas donde tableroParcial ya tenga, que es una matrix que tenia el valor inicial de la matriz antes del back.

podeis bajaros el codigo completo y el sudoku que estoy usando de aqui:

http://www.megaupload.com/?d=FRBOC4AW





Ruego una ayudita, que llegan las vacaiones y no quiero irme con la espinita clavada de que he fallado al crear un programa.

Etiquetas: borrar, panel
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:19.