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

[SOLUCIONADO] Error sin localizar en programa

Estas en el tema de Error sin localizar en programa en el foro de Java en Foros del Web. Hola, soy programador novato en Java, aunque tengo bastante experiencia en TBasic, Pascal y Assembler. Estoy diseñando una aplicación a modo de prueba para implementar ...
  #1 (permalink)  
Antiguo 01/08/2013, 03:13
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Error sin localizar en programa

Hola, soy programador novato en Java, aunque tengo bastante experiencia en TBasic, Pascal y Assembler.

Estoy diseñando una aplicación a modo de prueba para implementar la estructura en otro proyecto de mayores dimensiones. La idea es trabajar con 2 ventanas idénticas, las cuales están provistas de 3 botones:

- botonIncrementar: añade 1 a la variable contador1 o al 2, según esté activa la ventana 1 ó 2
- botonSalir: Sale de la aplicación
- botonCambia: Cierra la ventana actual y activa la otra

Se podría añadir a cada ventana 2 displays con los contadores acumulados, pero aún estoy buscando la forma.

El caso es que Eclipse me detecta un error en la línea:

Pantalla1 frame1 = new Pantalla1();

Concretamente me subraya "new Pantalla1()", mientras que no señala error en la siguiente línea de código, que es su gemela. Seguro que hay más errores de concepto que quizá influyan (o no) en ese error u otros, pero ya dije que soy novato en Java. El error específico que me marca Eclipse es:

"No enclosing instance of type CambiaPantalla is accessible. Must qualify the allocation with an enclosing instance of type CambiaPantalla (e.g. x.new A() where x is an instance of CambiaPantalla)"

Les agradecería cualquier tipo de orientación para la solución del error. Les adjunto el código a continuación.

Saludos.

Cita:
Código Java:
Ver original
  1. package Default;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5.  
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9.  
  10. public class CambiaPantalla {
  11.    
  12.     Pantalla1 frame1;
  13.     Pantalla2 frame2;
  14.     public int contador1 = 0;
  15.     public int contador2 = 0;
  16.            
  17.     public static void main (String[] args) {
  18.         Pantalla1 frame1 = new Pantalla1(); // AQUÍ INDICA EL ERROR
  19.         Pantalla2 frame2 = new Pantalla2();
  20.         frame2.setVisible(false);
  21.         frame1.setVisible(true);
  22.     }
  23.    
  24.     public class Pantalla1 extends JFrame implements ActionListener {
  25.        
  26.         private JPanel contentPane;
  27.        
  28.         public Pantalla1() {
  29.             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30.             contentPane = new JPanel();
  31.             contentPane.setLayout(null);
  32.             setBounds(10,10,640,480);
  33.             setContentPane(contentPane);
  34.             JButton botonSalir = new JButton("SALIR");
  35.                 botonSalir.setBounds(500,300,100,50);
  36.                 botonSalir.setActionCommand("salir");
  37.                 botonSalir.addActionListener(this);
  38.                 contentPane.add(botonSalir);
  39.             JButton botonIncrementar = new JButton("SUMAR");
  40.                 botonIncrementar.setBounds(50,100,100,50);
  41.                 botonIncrementar.setActionCommand("incr1");
  42.                 botonIncrementar.addActionListener(this);
  43.                 contentPane.add(botonIncrementar);
  44.             JButton botonCambia1 = new JButton("CAMBIA");
  45.                 botonCambia1.setBounds(50,300,100,50);
  46.                 botonCambia1.setActionCommand("cambia2");
  47.                 botonCambia1.addActionListener(this);
  48.                 contentPane.add(botonCambia1);
  49.         }
  50.        
  51.         public void incrementa1() {
  52.             ++contador1;
  53.         }
  54.        
  55.         @Override
  56.         public void actionPerformed(ActionEvent arg1) {
  57.             if (arg1.getActionCommand().equals("salir")) {
  58.                 System.exit(0);}
  59.            
  60.             else if (arg1.getActionCommand().equals("incr1")) {
  61.                 incrementa1();
  62.                 System.out.println("El Contador1 acumula: "+contador1);}
  63.            
  64.             else if (arg1.getActionCommand().equals("cambia2")) {
  65.                 frame1.setVisible(false);
  66.                 frame2.setVisible(true);}
  67.         }
  68.     }
  69.    
  70.     public class Pantalla2 extends JFrame implements ActionListener {
  71.  
  72.         private JPanel contentPane;
  73.        
  74.         public Pantalla2() {
  75.             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  76.             contentPane = new JPanel();
  77.             contentPane.setLayout(null);
  78.             setBounds(100,100,640,480);
  79.             setContentPane(contentPane);
  80.             JButton botonSalir = new JButton("SALIR");
  81.                 botonSalir.setBounds(500,300,100,50);
  82.                 botonSalir.setActionCommand("salir");
  83.                 botonSalir.addActionListener(this);
  84.                 contentPane.add(botonSalir);
  85.             JButton botonIncrementar = new JButton("SUMAR");
  86.                 botonIncrementar.setBounds(50,100,100,50);
  87.                 botonIncrementar.setActionCommand("incr2");
  88.                 botonIncrementar.addActionListener(this);
  89.                 contentPane.add(botonIncrementar);
  90.             JButton botonCambia2 = new JButton("CAMBIA");
  91.                 botonCambia2.setBounds(50,300,100,50);
  92.                 botonCambia2.setActionCommand("cambia1");
  93.                 botonCambia2.addActionListener(this);
  94.                 contentPane.add(botonCambia2);
  95.         }
  96.        
  97.         public void incrementa2() {
  98.             ++contador2;
  99.         }
  100.  
  101.         @Override
  102.         public void actionPerformed(ActionEvent arg2) {
  103.             if (arg2.getActionCommand().equals("salir")) {
  104.                 System.exit(0);}
  105.            
  106.             else if (arg2.getActionCommand().equals("incr2")) {
  107.                 incrementa2();
  108.                 System.out.println("El Contador2 acumula: "+contador2);}
  109.            
  110.             else if (arg2.getActionCommand().equals("cambia1")) {
  111.                 frame2.setVisible(false);
  112.                 frame1.setVisible(true);}
  113.         }
  114.     }
  115. }
  #2 (permalink)  
Antiguo 01/08/2013, 03:31
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Eso se debe a que tu código está mal, estás declarando una clase dentro de otra clase.

Aunque existe ese concepto, ni se hace de la forma en que has puesto ni se usa para lo que quieres.

Saca las clases Pantalla1 y Pantalla 2 de CambiaPantalla, y aún mejor, mete cada una en su propio archivo.

Creo que deberías leer algún tutorial básico, porque te ahorrarás errores como este.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 01/08/2013, 05:19
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Gracias por responder.

Lo hice en módulos de inicio y me daba otros errores que tampoco sabía resolver. Siguiendo tus indicaciones lo he vuelto a modular tal que:

Código Java:
Ver original
  1. package Default2;
  2.  
  3. public class CambiaPantalla {
  4.    
  5.     public static void main (String[] args) {
  6.  
  7.         Pantalla1 frame1 = new Pantalla1();
  8.         Pantalla2 frame2 = new Pantalla2();
  9.         frame1.setVisible(false);
  10.         frame2.setVisible(true);
  11.     }
  12. }

y la clase Pantalla1:

Código Java:
Ver original
  1. package Default2;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5.  
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9.  
  10. public class Pantalla1 extends JFrame implements ActionListener {
  11.    
  12.     private JPanel contentPane;
  13.     Pantalla1 frame1;
  14.     Pantalla2 frame2;
  15.     int contador1 = 0;
  16.    
  17.     public Pantalla1() {
  18.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  19.         contentPane = new JPanel();
  20.         contentPane.setLayout(null);
  21.         setBounds(10,10,640,480);
  22.         setContentPane(contentPane);
  23.         JButton botonSalir = new JButton("SALIR");
  24.             botonSalir.setBounds(500,300,100,50);
  25.             botonSalir.setActionCommand("salir");
  26.             botonSalir.addActionListener(this);
  27.             contentPane.add(botonSalir);
  28.         JButton botonIncrementar = new JButton("SUMAR");
  29.             botonIncrementar.setBounds(50,100,100,50);
  30.             botonIncrementar.setActionCommand("incr1");
  31.             botonIncrementar.addActionListener(this);
  32.             contentPane.add(botonIncrementar);
  33.         JButton botonCambia1 = new JButton("CAMBIA");
  34.             botonCambia1.setBounds(50,300,100,50);
  35.             botonCambia1.setActionCommand("cambia2");
  36.             botonCambia1.addActionListener(this);
  37.             contentPane.add(botonCambia1);
  38.     }
  39.    
  40.     public void incrementa1() {
  41.         ++contador1;}
  42.    
  43.     public void activaVentana2() {
  44.         frame2.setVisible(true);
  45.         frame1.setVisible(false);}
  46.    
  47.     @Override
  48.     public void actionPerformed(ActionEvent arg1) {
  49.         if (arg1.getActionCommand().equals("salir")) {
  50.             System.exit(0);}
  51.        
  52.         else if (arg1.getActionCommand().equals("incr1")) {
  53.             incrementa1();
  54.             System.out.println("El Contador1 acumula: "+contador1);}
  55.        
  56.         else if (arg1.getActionCommand().equals("cambia2")) {
  57.             activaVentana2();
  58.         }
  59.     }
  60. }

La clase Pantalla2 no la reproduzco porque es simétrica a Pantalla1.

En este caso sólo indica error en la consola de Eclipse cuando intento cambiar de ventana con el botón que arranca el método activaVentana2.

Agradeceré cualquier sugerencia. Saludos
  #4 (permalink)  
Antiguo 01/08/2013, 05:52
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Normal, dentro de activaVentana2 estás cambiando las propiedades de frame1 y frame2.

¿Pero quién es frame1? El atributo/propiedad que hay al principio de la clase Pantalla1

¿Tiene algún valor frame1? No, en ningún momento le asignas un valor, por lo que es null.

Eso te lo está diciendo la consola, lee siempre los errores que te salen, están para que sepas qué es lo que sucede y en qué línea de código.

Estás intentando aprender java por prueba y error, y así poco avanzarás. No sabes nada sobre ámbitos de variables, modificadores de acceso, etc, y son cosas básicas e imprescindibles.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 02/08/2013, 02:19
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Bueno, no me riñas tanto que soy muy sensible Tranquilo, sólo es una pequeña broma. Soy autodidacta y me alimento a base de vídeos, manuales y, como bien dices, de tropiezos... "enriquecedores".

Respecto al valor de frame1, en la línea 9 del main genero el objeto frame1 heredado de Pantalla1, cambio sus atributos mediante setVisible() y ahí no se queja. De hecho me permite acumular en contador1 con botonIncrementar. También se supone que frame1 debe contener los mismos atributos que Pantalla1, por lo que me parece redundante declararlo de nuevo, ya que no cambian.

Corrígeme si me equivoco en lo anterior. Por otro lado te agradecería que me indicaras en qué parte del código meto la pata u omito algo y si tiene una solución inmediata que no pase por matricularme en ingeniería informática Por mi parte seguiré atacando manuales para seguir aprendiendo, porque sé que Java es muy muy muy sofisticado y precisa mucha más dedicación de la que llevo acumulada, pero las prisas ajenas por ver resultados tangibles me traicionan.

Gracias por tu tiempo y saludos.

PD: me encargaron desarrollar en Java un simulador del software de una máquina determinada, que conllevaría el trabajo de meses de un equipo de programadores. No tengo límite de tiempo (todavía), pero estoy atascado en el cambio de una pantalla a otra y es algo frustrante.
  #6 (permalink)  
Antiguo 02/08/2013, 02:37
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Cita:
Respecto al valor de frame1, en la línea 9 del main genero el objeto frame1 heredado de Pantalla1, cambio sus atributos mediante setVisible() y ahí no se queja. ... También se supone que frame1 debe contener los mismos atributos que Pantalla1, por lo que me parece redundante declararlo de nuevo, ya que no cambian.
Ese es el problema, aunque se llamen igual, frame1 del main y frame1 de CambiaPantalla no es la misma referencia. El objeto frame1 está siendo creado dentro del main, por lo que sólo existe dentro de ese método. Eso es a lo que me refiero cuando digo que no conoces el ámbito de las variables.

Cita:
Por otro lado te agradecería que me indicaras en qué parte del código meto la pata u omito algo y si tiene una solución inmediata que no pase por matricularme en ingeniería informática
Solución, claro que la tiene y muy sencilla, prácticamente cualquiera del foro puede hacer lo que buscas en 5 minutos, por eso recalco la importancia de que leas un tutorial básico.

http://proyectosimio.wordpress.com/2...n-java-ambito/

El problema es que al desconocer lo básico, para corregirte o te lo resuelvo yo (no es mi estilo) o tengo que explicar lo básico de java, y eso está explicado en miles de tutoriales y mejor de lo que yo haría.

Pierde un par de horas leyendo un tutorial, avanzarás más.

http://www.matematica.ciens.ucv.ve/f...%20primero.pdf

Empieza por el capítulo 2
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 02/08/2013, 04:32
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Gracias, pero prefiero el AprendaJavaComo... sólo para consultas puntuales. Son mejores los manuales del estilo de tu referencia anterior al tema "ámbito", con explicaciones más coloquiales y ejemplos claros, aunque me quedo perplejo ante la imposiblidad de utilizar un atributo public en cualquier parte del programa, lo que parece un contrasentido. Tendré que seguir insistiendo...

Saludos
  #8 (permalink)  
Antiguo 02/08/2013, 04:54
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Cita:
aunque me quedo perplejo ante la imposiblidad de utilizar un atributo public en cualquier parte del programa, lo que parece un contrasentido.
No es que no se pueda hacer, es que no lo sabes hacer.

Cualquier variable public que sea atributo de instancia o clase puede ser accedido desde cualquier clase o método, pero una variable creada dentro de una función no. Si creas un objeto dentro de un método, o lo asignas a una referencia accesible, o la pasas como parámetro/return de una función, de lo contrario desaparece al salir del método.

Seguramente tu mayor problema es pasar de programación estructurada a objetos, es necesario entender que una cosa es la referencia y otra el objeto. En estructurado variable y valor van unidos, en OOP no.

Cita:
Gracias, pero prefiero el AprendaJavaComo... sólo para consultas puntuales.
A tu gusto, las búsquedas puntuales están bien cuando ya sabes, pero cuando no es difícil buscar lo que ni siquiera sabes que existe.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #9 (permalink)  
Antiguo 02/08/2013, 05:12
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Tu código tocando dos cosas

Código Javascript:
Ver original
  1. public class Proceso {
  2.    
  3.    
  4.      public static void main(String[] args) {
  5.        
  6.          Pantalla frame1 = new Pantalla("1");
  7.          Pantalla frame2 = new Pantalla("2");
  8.          frame1.setAlternativa(frame2);
  9.          frame2.setAlternativa(frame1);
  10.          frame1.setVisible(true);
  11.          
  12.     }
  13. }

Y solo una clase pantalla

Código Javascript:
Ver original
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3.  
  4. import javax.swing.JButton;
  5. import javax.swing.JFrame;
  6. import javax.swing.JPanel;
  7.  
  8. public class Pantalla extends JFrame implements ActionListener {
  9.    
  10.     private JPanel contentPane;
  11.     int contador = 0;
  12.     private Pantalla alternativa;
  13.     private String nombre;
  14.    
  15.     public void setAlternativa (Pantalla alternativa){
  16.         this.alternativa = alternativa;
  17.     }
  18.    
  19.     public Pantalla(String nombre) {
  20.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21.         this.nombre = nombre;
  22.         contentPane = new JPanel();
  23.         contentPane.setLayout(null);
  24.         setBounds(10,10,640,480);
  25.         setContentPane(contentPane);
  26.         JButton botonSalir = new JButton("SALIR");
  27.             botonSalir.setBounds(500,300,100,50);
  28.             botonSalir.setActionCommand("salir");
  29.             botonSalir.addActionListener(this);
  30.             contentPane.add(botonSalir);
  31.         JButton botonIncrementar = new JButton("SUMAR");
  32.             botonIncrementar.setBounds(50,100,100,50);
  33.             botonIncrementar.setActionCommand("incr1");
  34.             botonIncrementar.addActionListener(this);
  35.             contentPane.add(botonIncrementar);
  36.         JButton botonCambia1 = new JButton("CAMBIA");
  37.             botonCambia1.setBounds(50,300,100,50);
  38.             botonCambia1.setActionCommand("cambia");
  39.             botonCambia1.addActionListener(this);
  40.             contentPane.add(botonCambia1);
  41.     }
  42.    
  43.     public void incrementa1() {
  44.         ++contador;}
  45.    
  46.     public void activaVentana2() {
  47.         alternativa.setVisible(true);
  48.         this.setVisible(false);}
  49.    
  50.     @Override
  51.     public void actionPerformed(ActionEvent arg1) {
  52.         if (arg1.getActionCommand().equals("salir")) {
  53.             System.exit(0);}
  54.        
  55.         else if (arg1.getActionCommand().equals("incr1")) {
  56.             incrementa1();
  57.             System.out.println("El Contador " + nombre + " acumula: "+contador);}
  58.        
  59.         else if (arg1.getActionCommand().equals("cambia")) {
  60.             activaVentana2();
  61.         }
  62.     }
  63. }
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 05/08/2013, 02:10
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Cita:
Iniciado por Xerelo Ver Mensaje
No es que no se pueda hacer, es que no lo sabes hacer.
Efectivamente, no lo sé hacer desde el momento en que me encuentro frases lapidarias como: "cuando declaro un atributo o método de tipo public todas las clases tienen acceso a él". Patinaré si me tomo esa frase literalmente. A esa frase le falta matizar, relacionándola con tu segundo párrafo

Cita:
Iniciado por Xerelo
Cualquier variable public que sea atributo de instancia o clase puede ser accedido desde cualquier clase o método, pero una variable creada dentro de una función no. Si creas un objeto dentro de un método, o lo asignas a una referencia accesible, o la pasas como parámetro/return de una función, de lo contrario desaparece al salir del método.
Eso aclara el tema definitivamente.

Cita:
Iniciado por Xerelo
A tu gusto, las búsquedas puntuales están bien cuando ya sabes, pero cuando no es difícil buscar lo que ni siquiera sabes que existe.
No me malinterpretes. El AprendaJavaComo... posiblemente sea el más completo de los manuales de Java, pero es un texto demasiado farragoso para leérmelo entero. Me explicaré con un ejemplo: en la universidad tuve algún profesor que se limitaba a copiar en la pizarra sus apuntes desde unas hojas amarillas (por antiguas). Otros me parecían más amenos simplemente por su forma coloquial de explicar los temas. En las clases de los primeros me limitaba a copiar pizarras, para luego intentar razonarlo por mi cuenta. En las clases de los segundos salía habiendo comprendido.

Con ésto quiero decir que prefiero una explicación inicial comprensible, para después desarrollar; antes que empezar de cero con una explicación tan rigurosa como tortuosa. Avanzo más deprisa con el primer método. Preferencias personales...

En cualquier caso te agradezco tu tiempo y esfuerzo, sinceramente. Ahora me queda razonar por mi cuenta los cambios que has realizado en el código.

Saludos
  #11 (permalink)  
Antiguo 05/08/2013, 02:46
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

La frase es la que es y describe la realidad correcta y literalmente.

Lo que te chirría precisamente es la falta de conocimiento sobre modificadores de acceso, porque dentro de un método no puedes declarar variables public, da un error de compilación. Por lo tanto es totalmente cierto que un método/variable public es accesible (si la instancia/clase lo es también) desde cualquier sitio.

Y repito, es muy importante que entiendas la diferencia entre referencia/variable y objeto al que apunta.

El código que he modificado es simplemente para que funcione, se puede hacer de muchas formas, seguramente cuando vayas definiendo exactamente lo que quieres hacer tendrás que modificarlo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #12 (permalink)  
Antiguo 12/08/2013, 01:33
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Por si a alguien que estuviera en mi misma situación le interesara, expongo el código a partir del cual conseguí hacer funcionar mi programa como quería: desde el main escojo la ventana a la que ir mediante botones, cerrando y abriendo respectivamente, y pudiendo volver a la ventana inicial desde otro botón en la secundaria.

Hasta yo lo entiendo (es broma, Xerelo)

El main:

Código:
import javax.swing.*; 
import java.awt.event.*;

public class Login extends JFrame implements ActionListener {
	
	private JPanel panelLogin;
	
    Login(){
        panelLogin = new JPanel();
        panelLogin.setLayout(null);
    	setBounds(50,50,400,400);
        setTitle("Ventana de Login");
        setContentPane(panelLogin);
        JButton btnLogin1 = new JButton("Ventana 1");
	        btnLogin1.setBounds(150,100,100,50);
	        btnLogin1.setActionCommand("ventana1");
	        btnLogin1.addActionListener(this);
	        panelLogin.add(btnLogin1);
        JButton btnLogin2 = new JButton("Ventana 2");
	        btnLogin2.setBounds(150,250,100,50);
	        btnLogin2.setActionCommand("ventana2");
	        btnLogin2.addActionListener(this);
	        panelLogin.add(btnLogin2);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    
    public static void main(String[] args) {
        new Login(); 
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("ventana1")) {
        	new Ventana1(this);
        }
        else if (e.getActionCommand().equals("ventana2")) {
        	new Ventana2(this);
        }
    }
}
La clase Ventana1, idéntica a Ventana2 con las salvedades evidentes, es decir, sustituir los "1" por "2" y listo:

Código:
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;

class Ventana1 extends JFrame implements ActionListener {    
    JFrame ventanaLogin;
    private JPanel panel1;
    
    Ventana1(JFrame ventanaLogin) {
        this.ventanaLogin = ventanaLogin;
        ventanaLogin.setVisible(false);
        
        panel1 = new JPanel();
        setTitle("Ventana 1");
        panel1.setLayout(null);
    	setBounds(200,200,400,400);
    	setContentPane(panel1);
        JButton btnP1 = new JButton("Salir 1");
            btnP1.addActionListener(this);
            panel1.add(btnP1);
            btnP1.setBounds(150,200,100,50);
        this.setVisible(true);
        // Con la linea sig. saldría de la aplicación
        // Sin la linea sig. vuelve a Login si clic en X, igual que botón "salir"
        // this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addWindowListener(new Ventana1.ManejadorDeVentana1()); 
    }

    private void activarVentanaLogin() {
        this.setVisible(false);
        ventanaLogin.setVisible(true); 
    }

    public void actionPerformed(ActionEvent e) {
        activarVentanaLogin(); 
    }

    class ManejadorDeVentana1 extends WindowAdapter{
        public void windowClosing(WindowEvent e) {
            activarVentanaLogin(); 
        } 
    }
}
  #13 (permalink)  
Antiguo 12/08/2013, 03:44
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Error sin localizar en programa

Pues mucho no has entendido cuando tienes dos clases exactamente iguales, ya te dije cuando te puse el código que sólo es necesaria una. Estás yendo contra los principios de la orientación a objetos.

Aparte de eso estás haciendo una cosa muy mal, que es crear una nueva instancia de ventana cada vez que haces un cambio, así lo único que vas a conseguir es petar la memoria.

El hecho de que las pongas a visible=false no significa que desaparezcan, sólo que no las ves.

Es un ejercicio sencillísimo, y te está llevando un montón de tiempo por simple cabezonería.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #14 (permalink)  
Antiguo 13/08/2013, 01:51
 
Fecha de Ingreso: agosto-2013
Ubicación: Barcelona
Mensajes: 7
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Error sin localizar en programa

Ya dije al principio del hilo que sólo buscaba la manera de cambiar de ventana mediante un botón, que sólo necesitaba averiguar el modo para aplicarlo a otro proyecto de mayores dimensiones con multitud de pantallas DISTINTAS. Lo de crear 2 clases iguales sólo fue por simplificar las pruebas.

Cita:
Es un ejercicio sencillísimo, y te está llevando un montón de tiempo por simple cabezonería.
Agradezco el interés y las molestias, amigo, pero de sencillísimo no tiene nada. Lo averiguaré, pero estoy convencido de que el software que quiero emular lo diseñó un equipo de programadores expertos a lo largo de muchos meses... o quizá varios años, mientras que yo estoy sólo, no puedo dedicarme al completo, ni siquiera me pagan y en breve me pedirán resultados; de forma que me gustaría poder mostrar algo palpable. No es lo mismo enseñar algo prometedor y que entre por la vista, que excusarme diciendo que prefiero antes estudiar Java como es debido. Lo haré sobre la marcha, como solemos hacer los ingenieros. A veces es más conveniente tomar un atajo, aunque te encuentres algunas zarzas.

Saludos

PD: Por supuesto que en un próximo refinamiento añadiré la orden "dispose()" para liberar la memoria de las ventanas que abandono, no te preocupes.

Etiquetas: localizar, programa, string
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 19:16.