2015-12-02 83 views
3

非常多的標題。代碼應該繪製一個盒子,等待1秒鐘,然後在另一個位置繪製一個新盒子並重新繪製。相反,它會等待1秒鐘,然後繪製兩個盒子。感謝您的幫助和抱歉,如果我搞亂格式化。Thread.sleep()延遲整個程序,而不僅僅是它之後

import javax.swing.*; 
import java.awt.*; 

public class GameRunner extends JPanel{ 
    @Override 
    public void paintComponent (Graphics g){ 
     int x = 0; 
     boolean directionRight = true; 
     g.setColor(Color.blue); 
     g.fillRect(300,400,100,100); 
     repaint(); 
     try{ 
     Thread.sleep(1000); 
     } 
     catch (Exception ex){} 
     g.fillRect(600,400,100,100); 
     repaint(); 
    } 
    public static void main (String[] args){ 
     JFrame frame = new JFrame("Submarine"); 
     GameRunner gameRunner = new GameRunner(); 
     frame.add(gameRunner); 
     frame.setSize(1200,700); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 
+0

你需要在你的'main'睡覺 - 調用方法兩次 –

+5

歡迎來到「媽媽,我凍結事件調度線程」的美妙世界。先看看[AWT和Swing中的繪畫](http://www.oracle.com/technetwork/java/painting-140037.html)和[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency /)來了解Swing的繪畫過程如何工作。然後看看[如何使用Swing Timers](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)獲取可能的解決方案 – MadProgrammer

+0

我在哪裏可以完全明瞭? –

回答

10
  • Thread.sleep(1000);將阻止當前正在運行的線程
  • paintComponent從事件指派線程的上下文中調用。
  • Swing在完成處理當前(本例中爲「paint」)事件之前不會更新UI的狀態,這意味着雖然在Thread.sleep處被阻止,但UI上不會更新任何內容,也不會有新事件發生處理。

Swing是一個單線程框架。您不應該在事件派發線程的上下文中執行任何阻塞或長時間運行的操作。

查看Concurrency in Swing瞭解更多詳情,How to use Swing Timers查找可能的解決方案。

作爲一個方面說明,如果用戶界面或任何變量的UI依賴於任何繪畫方法,你應該永遠不要修改狀態。繪畫應該只畫當前狀態的組件,但不會改變它,這包括直接或間接

例如調用repaint ...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class GameRunner extends JPanel { 

    private int xPos = 300; 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.blue); 
     g.fillRect(xPos, 400, 100, 100); 
     repaint(); 
    } 

    public GameRunner() { 
     Timer timer = new Timer(1000, new ActionListener() { 
      private boolean state = false; 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (state) { 
        xPos = 300; 
       } else { 
        xPos = 600; 
       } 
       state = !state; 
       repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(700, 500); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new GameRunner()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

好答案... +1 – Luffy

相關問題