Foro de elhacker.net

Programación => Java => Mensaje iniciado por: MasterPunk en 10 Junio 2013, 14:58 pm



Título: Pregunta jFrame
Publicado por: MasterPunk en 10 Junio 2013, 14:58 pm
Hola, estoy haciendo una pequeña aplicación gráfica (llamémosla "juego") que resumidamente es asi:

Código
  1. package juego;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.RenderingHints;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9.  
  10. public class Juego extends JPanel {
  11.  
  12.    void move() {
  13.        //no entrare en detalles
  14.    }
  15.  
  16.    @Override
  17.    public void paint(Graphics g) {
  18.        super.paint(g);
  19.        Graphics2D g2d = (Graphics2D) g;
  20.        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  21.                RenderingHints.VALUE_ANTIALIAS_ON);
  22.        g2d.setColor(Color.red);
  23.        g2d.fillRect(100, 100, 100, 100);//pinta un cuadrado rojo
  24.    }
  25.  
  26.    public static void main(String[] args) {
  27.        JFrame frame = new JFrame();
  28.        Juego game = new Juego();
  29.        frame.add(game);
  30.        frame.setSize(300, 300);
  31.        frame.setVisible(true);
  32.        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  33.        while (true) { //bucle de juego
  34.            game.move();
  35.            game.repaint();
  36.            try {
  37.                Thread.sleep(15);
  38.            } catch (InterruptedException ex) {
  39.            }
  40.        }
  41.    }
  42. }
  43.  

El problema es que cuando intento que la ventana se cree al pulsar un botón de otro jFrame:

Código
  1. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  2.        JFrame frame = new JFrame();
  3.        Juego game = new Juego();
  4.        frame.add(game);
  5.        frame.setSize(300, 300);
  6.        frame.setVisible(true);
  7.        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  8.        while (true) { //bucle de juego
  9.            game.move();
  10.            game.repaint();
  11.            try {
  12.                Thread.sleep(15);
  13.            } catch (InterruptedException ex) {
  14.            }
  15.        }
  16.    }
  17.  

La pantalla sale en blanco y no me deja cerrarla. ¿Sabríais decirme a que se debe?
Gracias


Título: Re: Pregunta jFrame
Publicado por: RyogiShiki en 10 Junio 2013, 18:37 pm
Estas haciendo una llamada bloquente dentro del EDT (Event Dispath Thread) que es donde se ejecutan las aplicaciones Swing. En otras palabras los ciclos while(true) deben ejecutarse en su propio Thread.

Saludos