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

Dudas con JFrame y JPanel

Estas en el tema de Dudas con JFrame y JPanel en el foro de Java en Foros del Web. Hola, estoy haciendo un proyecto que consiste en el juego RType pero de forma muy básica, la parte del modelo está hecha pero a la ...
  #1 (permalink)  
Antiguo 28/05/2013, 09:40
Avatar de Shineye  
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Dudas con JFrame y JPanel

Hola, estoy haciendo un proyecto que consiste en el juego RType pero de forma muy básica, la parte del modelo está hecha pero a la hora de implementar la IGU me surge una duda.

La interfaz del juego debería mostrar en una misma ventana un menú con las opciones "jugar" y "salir", que consisten en 2 botones. Al pulsar Salir, la aplicación sale y al pulsar jugar este menú con dos botones desaparece y aparece otro con cuatro niveles de dificultad que al pulsarlos inicia el juego con ciertos parámetros para el juego. Una vez finaliza el juego, sin cambiar de ventana, debe mostrar otra vez el primer menú, en el que salía el botón de "jugar".

Mi idea es hacer una clase que extiende JFrame con un JPanel que contenga otras clases que extienden JPanel (una de ellas es el menú jugar, otra el menú de dificultad y otra el juego en sí donde se pintan las naves). No sé si es la mejor forma de implementar esto puesto que no tengo mucha experiencia en IGU. El caso es que una vez finalizado el juego quiero que aparezca el primer menú en la ventana y no en una ventana a parte como me pasa ahora.

Para cambiar el panel podría hacer lo siguiente, ¿verdad?

En la clase JFrame:

contenedorPrincipal.add(JPanel1);

y para borrarlo:

remove(JPanel1);

Os agradecería que me echaseis una mano, llevo varios días intentando solucionarlo pero por más que le doy vueltas no sé cómo solucionarlo.

Muchas gracias de antemano.



Saludos
  #2 (permalink)  
Antiguo 28/05/2013, 14:16
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Dudas con JFrame y JPanel

Pues sí, puedes hacer lo que has dicho, add() y remove(). Unicamente, llama al método updateUI() de alguno de los paneles o frame después de haber hecho el cambio para que se refresque la pantalla.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 29/05/2013, 11:58
Avatar de Shineye  
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Dudas con JFrame y JPanel

Muchas gracias por contestar tan rápido y por la ayuda.

Los métodos add() y remove() para los paneles me funcionan perfectamente pero me surge una nueva duda: llego al panel del juego y una vez el juego finaliza necesito mostrar de nuevo el panel de "jugar" y "salir". No sé si es error de diseño de clases o es que después de tantos días probando estoy bloqueado.

Mi diseño para la parte de la IGU es:

- Una clase que extiende JFrame y esta a su vez contiene 2 paneles, uno es el menú con los botones jugar y salir, y otro panel que contiene los niveles de juego.

- Una vez seleccionado el nivel de juego, el flujo del programa va a otra clase a parte que extiende JPanel que es la encargada de pintar las naves y el resto de elementos que se verán en la pantalla de juego. Esta clase tiene un ActionListener que maneja los eventos.

El caso es que llego a la parte en la que elimino el panel de juego con remove("aquí el panel a eliminar") pero después no consigo mostrar el primer panel (menú jugar).

¿Mi diseño de clases es correcto? ¿Qué podría hacer para volver a mostrar ese menú?

Muchas gracias por la ayuda.



Saludos,
  #4 (permalink)  
Antiguo 29/05/2013, 14:19
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Dudas con JFrame y JPanel

¿Qué quiere decir esto "pero después no consigo mostrar el primer panel (menú jugar)." exactamente?. ¿Qué código pones?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 30/05/2013, 14:04
Avatar de Shineye  
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Dudas con JFrame y JPanel

Hola,

Te muestro el código y te indico cuál es el flujo del programa (IGU):


El código de la parte de la IGU es:

Clase principal que inicia el juego:

Código:
public class RType
{
   RType rtype;

 
    
    public RType()
    {
        
        lanzarJuego();
    }
    
    public static final void main(String[] args)
    {
        new RType();
    }
    
    public void lanzarJuego()
    {
        rtype = new RType();
        rtype.menuJugar();
    }
}
Clase que extiende JFrame y pinta el menú "jugar" o "salir":

Código:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Dimension;
import java.awt.Font;

public class PantallaBienvenida extends JFrame
{
    private Tablero tablero;
    private JPanel panelContenedor;
    private JButton botonJugar;
    private JButton botonSalir;
    private JPanel botonera;
    
    
    
    public PantallaBienvenida()
    {
        setTitle("R-Type");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(480, 380);
        setLocationRelativeTo(null);
        setResizable(false);
        panelContenedor = new JPanel();
        botonera = new JPanel();
        botonJugar = new JButton();
        botonSalir = new JButton();
        tablero = new Tablero();
        setVisible(true);
        
    }
    
    
    public void menuJugar()
    {   
        panelContenedor = (JPanel) getContentPane();
        panelContenedor.setBorder(new EmptyBorder(150, 75, 120, 80));
        panelContenedor.setBackground(Color.BLACK);
        
        panelContenedor.setLayout(new BorderLayout(4, 4));
        
        botonera.setLayout(new GridLayout(0, 1));
        
        botonJugar.setText("JUGAR");
        botonJugar.setPreferredSize(new Dimension(300, 30));
        botonJugar.setFont(new Font("Arial Bold", 1, 16));
        botonJugar.setForeground(Color.BLACK);
        botonJugar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) { jugar(); }
        });
        botonera.add(botonJugar);
        
        botonSalir.setText("SALIR");
        botonSalir.setPreferredSize(new Dimension(300, 30));
        botonSalir.setFont(new Font("Arial Bold", 1, 16));
        botonSalir.setForeground(Color.BLACK);
        botonSalir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) { salir(); }
        });
        botonera.add(botonSalir);
        
        panelContenedor.add(botonera, BorderLayout.CENTER);
        pack();
        
        Toolkit.getDefaultToolkit().sync();
        setVisible(true);
    }
    
    public void salir()
    {
        System.exit(0);
    }
    
    public void jugar()
    {
        remove(botonera);
        remove(panelContenedor);
        
        panelContenedor = (JPanel) getContentPane();
        panelContenedor.setBorder(new EmptyBorder(0, 0, 0, 0));
        panelContenedor.setBackground(Color.BLACK);
        pack();
        
        panelContenedor.add(tablero = new PanelTablero());
        panelContenedor.setVisible(true);
        pack();
        
        Toolkit.getDefaultToolkit().sync();
        pack();
    }        

}
Clase que extiende JPanel e implementa ActionListener. Esta clase pinta las naves y lleva el control del teclado, etc.

Código:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

public class Tablero extends JPanel implements ActionListener
{
    private Timer timer;
    private TableroPanel tableroJuego;
    private boolean juegoTerminado;
    
    public Tablero()
    {
        tableroJuego =  new TableroPanel();
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.BLACK);
        setBorder(new EmptyBorder(0, 480, 380, 0));
        setDoubleBuffered(true);
        juegoTerminado = false;
        
        timer = new Timer(5, this);
        timer.start();
    }
    
    public void paint(Graphics g)
    {
        super.paint(g);
        
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(tableroJuego.getImagenAliada(), tableroJuego.getXAliada(), tableroJuego.getYAliada(), this);
        for (int i = 0; i < tableroJuego.getNaveAlien(); i++) {
            g2d.drawImage(tableroJuego.getImagenAlien(i), tableroJuego.getXAlien(i), tableroJuego.getYAlien(i), this);
        }
        
        ArrayList<Misil> ms = tableroJuego.getMisiles();
        
        for (int i = 0; i < ms.size(); i++) {
            Misil m = (Misil) ms.get(i);
            g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
        }
        
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
    
    public int getLimiteAliens()
    {
        return tableroJuego.getLimiteAliens();
    }
    
    public boolean getIngame()
    {
        return tableroJuego.getIngame();
    }
    
    public boolean juegoTerminado()
    {
        return juegoTerminado;
    }
    
    public void actionPerformed(ActionEvent e)
    {
        requestFocusInWindow();
        if(getLimiteAliens() == 0 || getIngame() == false) {
            timer.stop();
            setFocusable(false);
            setVisible(false);
            remove(this);
            juegoTerminado = true;
            repaint();
        }
        tableroJuego.comprobarColisiones();
        tableroJuego.moverEnTablero();
        repaint();
    }
    
    private class TAdapter extends KeyAdapter
    {
      public void keyReleased(KeyEvent e) 
      {
          tableroJuego.getAliada().keyReleased(e);
      }
      
        
      public void keyPressed(KeyEvent e)
      {
          tableroJuego.getAliada().keyPressed(e);
      }
    } 
}


El flujo del programa es:

1º. Se inicia el programa.
2º. Se muestra el menu de "jugar" o "salir".
3º. Si eliges salir, el programa finaliza.
4º. Si eliges jugar, aparecen las naves y puedes jugar hasta que el juego finalice.

Lo que no entiendo, y es en lo que llevo días estancado, es cómo puedo hacer para que mi programa vuelva a mostrar el menú del paso 2º una vez finalice el 4º paso.

Es como si el flujo del programa se quedase en el ActionListener de la clase Tablero. Si pongo allí un nuevo objeto PantallaBienvenida con el método menuJugar() crea una ventana nueva pero deja la anterior, al final tengo dos ventanas.

Muchísimas gracias por la ayuda.



Saludos.
  #6 (permalink)  
Antiguo 02/06/2013, 17:32
Avatar de Shineye  
Fecha de Ingreso: mayo-2013
Mensajes: 4
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Dudas con JFrame y JPanel

Por favor, ¿me echáis una mano con esto?

Sigo dándole vueltas y no sé cómo hacer para que la ventana vuelva a mostrar el menú "jugar".

Muchas gracias.

Etiquetas: clase, dudas, jframe, jpanel
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 17:12.