2015-04-04 35 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