2015-04-04 59 views
0

我一直在python编程一段时间,一直对Java学习一段时间感兴趣,所以我想我会给它一个去,所以有怜悯,我知道这是一个无限循环,因此踩踏小心。Java程序流程

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

public class snake extends JFrame{ 
    public static void main(String[] args) { 
     JFrame screen = new JFrame("Snake"); 
     screen.setSize(640, 480); 
     screen.setResizable(false); 
     screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container pane = screen.getContentPane(); 
     screen.setVisible(true); 
     while(true) { 
      pane.add(new Render()); 
     } 
    } 

} 
class Render extends JComponent { 
    Render(){ 
    } 
    public void paint(Graphics g) { 
     g.setColor(Color.white); 
     g.fillRect(0,0,640,480); 
     g.setColor(Color.green); 
     g.fillRect(100,100,25,25);  
    } 
} 

我对这个小程序目前的目标是循环我的代码,这样每次我while循环迭代我想的码流更新屏幕重绘任何所以在今后的矩形可以移动。从我的测试中,我已经通过该方法运行循环运行的第一次迭代的在我的渲染类,然后之后,它停留在(我相信这是在Java中的构造函数)

Render() { 
} 

一段代码。它循环遍历每一次迭代,我希望它的方法。我试图从构造函数中调用该方法,但这种方法无效。我如何路由程序的流程,以便循环中的每个迭代程序都能通过该方法?谢谢你的时间。

回答

2

开始采取看看Painting in AWT and SwingPerforming Custom Painting关于画中的Swing如何工作的详细信息...

这...

while(true) { 
    pane.add(new Render()); 
} 

会造成问题。如果它不阻塞事件调度线程,它将运行得如此之快,因为它会导致其他线程停顿(或运行速度更慢),并简单地连续添加Renderpane的新实例,我敢肯定你不会想。

通常鼓励覆盖paintComponent而不是paint,因为它可能导致更少的问题。在做任何自定义绘画之前,你也应该打电话给super.paintComponent

相反,只需创建的Render一个实例,并把它添加到框架

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Snake { 

    public static void main(String[] args) { 
     new Snake(); 
    } 

    public Snake() { 
     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 Render()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    class Render extends JComponent { 

     Render() { 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.white); 
      g.fillRect(0, 0, 640, 480); 
      g.setColor(Color.green); 
      g.fillRect(100, 100, 25, 25); 
     } 
    } 
} 

你可能会想进行一些动画,看看Concurrency in SwingHow to use Swing Timers更多细节

对于example

+0

那么你对在awt中渲染的建议是什么?有没有一种方法可以在添加Render()的新实例之前清除窗格amd我如何路由我的代码以在循环的每次迭代中重新渲染矩形?谢谢你的回应。 – Ryan 2015-04-04 03:18:50

+0

不,不要在每个循环中添加一个新的“渲染”窗格,只需创建一个实例并添加它。你可以在'Render'中更改变量以生成动画 – MadProgrammer 2015-04-04 03:19:54

+0

好吧谢谢你的回答我认为Render的实例在添加后不会改变,你需要更新它 – Ryan 2015-04-04 03:21:37