2016-05-04 11 views
1

Ich verstehe, dass dies wahrscheinlich ein sehr einfaches Problem ist, aber da ich nur mit JPanel und JFrame für ein Wochenende gearbeitet habe, bitte nicht zu viel auf mich. Mein Problem ist, dass ich diesen Code:JPanel wird nicht aktualisiert oder Repaint bis For Loop Finishes

package Game_Elements; 
import java.awt.Color; 
import java.awt.Desktop.Action; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.RenderingHints.Key; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.AbstractAction; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game implements KeyListener 
{ 
private JFrame frame = null; 
private JPanel panel = null; 
int y = 0; 
int x = 0; 
public boolean W_TRUE; 
public boolean S_TRUE; 
public boolean A_TRUE; 
public boolean D_TRUE; 
public void keyPressed(KeyEvent e) 
{ 

    if(e.getKeyCode()== KeyEvent.VK_W){ 
      y-= 15; 
      panel.setLocation(x, y); 
      W_TRUE = true; 

    } 
    if(e.getKeyCode()== KeyEvent.VK_S){ 
      y+= 15; 
      panel.setLocation(x, y); 
      S_TRUE = true; 
    } 
    if(e.getKeyCode()== KeyEvent.VK_A){ 
      x-= 15; 
      panel.setLocation(x, y); 
      A_TRUE = true; 
    } 
    if(e.getKeyCode()== KeyEvent.VK_D){ 
      x+= 15; 
      panel.setLocation(x, y); 
      D_TRUE = true; 
    } 
    if(D_TRUE == true && S_TRUE == true){ 
     y+= 15; 
     x+= 15; 
     panel.setLocation(x, y); 
    } 
    if(A_TRUE == true && W_TRUE == true){ 
     y-= 15; 
     x-= 15; 
     panel.setLocation(x, y); 
    } 
    if(A_TRUE == true && S_TRUE == true){ 
     y+= 15; 
     x-= 15; 
     panel.setLocation(x, y); 
    } 
    if(D_TRUE == true && W_TRUE == true){ 
     y-= 15; 
     x+= 15; 
     panel.setLocation(x, y); 
    } 
} 
public void keyReleased(KeyEvent e) 
{ 
    if(e.getKeyCode()== KeyEvent.VK_W){ 
     W_TRUE = false; 
} 
if(e.getKeyCode()== KeyEvent.VK_S){ 
     S_TRUE = false; 
} 
if(e.getKeyCode()== KeyEvent.VK_A){ 
     A_TRUE = false; 
} 
if(e.getKeyCode()== KeyEvent.VK_D){ 
     D_TRUE = false; 
} 
if(e.getKeyCode()== KeyEvent.VK_SPACE){ 
    System.out.println("Running JUMP"); 
    for(int j = y - 200; j < y; y-= 15){ 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     panel.setLocation(x, y); 
     panel.revalidate(); 
    } 
    System.out.println("Complete"); 

} 
} 

public void keyTyped(KeyEvent e) { 

} 

public void frameStart() 
{ 

    frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setTitle("Desperation"); 
    frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // otherwise nice exceptions java.awt.AWTError: 
    frame.setPreferredSize(new Dimension(1920, 1050)); 
    frame.setSize(new Dimension(1920, 1050)); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    System.out.println("Frame Created"); 

    panel = new JPanel(); 
    panel.setBackground(Color.BLUE); 
    panel.setMaximumSize(new Dimension(200, 200)); 
    panel.setLocation(1080, 500); 
    panel.revalidate(); 
    frame.add(panel); 
    System.out.println("Panel Created"); 

    frame.addKeyListener(this); 
    System.out.println("Listener Created"); 
} 

public static void main(String[] args){ 

    Game obj = new Game(); 

    obj.frameStart(); 
} 

}

Die Panel Ich habe ein grundlegender 200x200 blauer Würfel, scheint nicht Position zu ändern, bis die Schleife läuft getan wird, so dass es eher ein ist springen als alles andere. Ich verstehe, dass die Repaint-Funktion nur so schnell wie möglich ausgeführt wird, und da dies wahrscheinlich das Problem ist, habe ich mich gefragt, ob jemand von euch gute Leute über eine alternative Methode zum Auffrischen beraten hat, damit es nicht unbedingt glatt aussieht, sondern an mindestens zeigen einige Progression. Jeder Rat wird geschätzt, da ich nicht viel über JPanel, JFrame oder wirklich JAnything weiß. Vielen Dank!

+0

Beginnen Sie mit [Concurrency in Swing] (https://docs.oracle.com/javase/tutorial/uiswing/ Nebenläufigkeit /) für das, was das Problem verursacht, siehe [Wie Swing Timer zu verwenden] (https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) für eine mögliche Lösung und [How Tastenkombinationen zu verwenden] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) zu lösen, was wahrscheinlich eine andere Frage in der Zukunft wird – MadProgrammer

Antwort

0

Für erfrischende

this.revalidate(); 

ist ein guter Weg, um "refresh" Ihre JComponent

+0

... 'Thread.sleep' in der SOMMERZEIT? – MadProgrammer

+0

Auch 'revalidate' wirkt sich auf das Layout aus, wenn man davon ausgeht, dass das OP ein Layout verwendet, aber da' setLocation' diese Tatsache in Frage stellt – MadProgrammer

+0

@MadProgrammer .... Hmmm .... Mehr Code muss angezeigt werden, aber ich Sieh deinen Punkt. Aber ich werde die Post nicht entfernen, bis es mehr Code gibt, der eine andere Lösung vorschlägt. Als weiteres Problem wäre das thread.sleep kontinuierlich für die angegebene lange Zeit ausgeführt. – DarkV1