2015-12-02 62 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

相关问题