2016-05-04 3 views
1

Я понимаю, что это, вероятно, очень простая проблема, но поскольку я работаю только с JPanel и JFrame на один уик-энд, пожалуйста, не мешайте мне слишком много. Моя проблема заключается в том, что у меня есть этот код:JPanel не обновляет или не перерисовывает до тех пор, пока петля не закончит

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(); 
} 

}

панель у меня есть, основной 200x200 синий куб, не кажется, чтобы изменить местоположение, пока цикл не выполняется работает, так что это больше из прыгать чем угодно. Я понимаю, что функция repaint работает только как можно скорее, и, поскольку это, скорее всего, проблема, мне было интересно, есть ли у кого-нибудь из вас хорошие люди советы по альтернативному методу для обновления, поэтому это не обязательно выглядит гладко, но при по крайней мере, показывают некоторую прогрессию. Любые советы приветствуются, поскольку я мало что знаю о JPanel, JFrame или действительно JAnything. Спасибо!

+0

Начать с [параллельности в свинг] (https://docs.oracle.com/javase/tutorial/uiswing/ параллелизм /) для того, что вызывает проблему, посмотрите на [Как использовать таймеры Swing] (https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) для возможного решения и [Как использовать привязки клавиш] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), чтобы решить, что скорее всего станет другим вопросом в будущем – MadProgrammer

ответ

0

Для освежающего

this.revalidate(); 

хороший способ "освежить" свой JComponent

+0

... 'Thread.sleep' в ПО ВОСТОЧНОМУ ВРЕМЕНИ? – MadProgrammer

+0

Также «revalidate» влияет на макет, предполагая, что OP использует макет, но поскольку существует 'setLocation', который ставит под сомнение тот факт, что факт – MadProgrammer

+0

@MadProgrammer .... Хммм .... Больше кода нужно показать, но я см. свою точку зрения. Но я не собираюсь удалять сообщение, пока не появится больше кода, предлагающего другое решение. Еще одной проблемой будет поток thread.sleep, непрерывно работающий для данного Long time. – DarkV1