usar event ejemplo como java swing jframe jbutton event-dispatch-thread

java - ejemplo - netbeans button click event



¿Llamar a un método desde un JButton es congelar un JFrame? (2)

Parece que tienes un paréntesis que no pertenece al penúltimo punto y coma. Intenta eliminarlo

Estoy haciendo un juego básico de Pong para una clase. Tengo el Pong funcionando, y tengo una pantalla GUI en el arranque, desafortunadamente parece que no puedo comenzar el juego desde el principio JButton. Comenté dónde está el problema en el código y eliminé el código irrelevante.

frame.add(GUIPanel); JButton startButton = new JButton("Start!"); GUIPanel.add(startButton, BorderLayout.CENTER); startButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.getContentPane().remove(GUIPanel); frame.validate(); frame.repaint(); drawPanel = new DrawPanel(); drawPanel.requestFocus(); frame.getContentPane().add(BorderLayout.CENTER, drawPanel); //This is the part that freezes it, everything else works fine //except that the playGame method isn''t called. If I remove the whole //startButton and whatnot I can call playGame and it works perfectly. playGame(); } }); }

¿algunas ideas?


Swing es un marco de rosca único.

Es decir, todas las interacciones y modificaciones en la UI deben realizarse desde el contexto del subproceso de distribución de eventos. Cualquier cosa que bloquee este hilo evitará que procese, entre otras cosas, las solicitudes de repintado y las interacciones / entrada del usuario.

Mi suposición es que playGame está usando algo como Thread.sleep o algún tipo de while(true) y está bloqueando el EDT, haciendo que tu programa aparezca como si estuviera congelado.

Lea a través de Concurrency in Swing para más detalles.

Una solución simple sería usar un Timer oscilación para actuar como un bucle de juego. Cada vez que funciona, debes actualizar el estado de tu juego y llamar (algo así como) repaint sobre el componente de tu juego