2014-02-09 44 views
0

我已經嘗試了許多變化的一切在這個類的底部,迄今沒有任何作品。有時編輯會導致打印語句正常工作,但窗口始終打開的大小甚至不是我設置的大小並保持空白。我不知道它有什麼問題。我試圖在窗口之間打印1024個矩形,並在每次打印之間暫停。值是正確的,他們只是因爲某些原因沒有被繪。將該方法更改爲paintComponent似乎也做不了多少。代碼很長,所以這裏是一個pastebin:http://pastebin.com/ridipz3X。更重要的事情是在比賽的最後階段:我如何正確地繪製到框架/面板?

JFrame frm = new TestEnvironment(); 
         frm.setSize(1152, 1152); 
         frm.setVisible(true); 
         JPanel panel = new JPanel(); 
         frm.add(panel); 
         t = 0; 
         i = 0; 
         while (t < x - 1) { 

           panel.repaint(); 

           j++; 
           t++; 
           Thread.sleep(10000); 
         } 

       } catch (Exception e) { 
         System.out.println(e); 
         e.printStackTrace(); 
       } 
     } 
public void paint(Graphics g) { 
       g.setColor(Color.black); 
       g.setColor(getBackground()); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
       g.setColor(getForeground()); 
       try { 
         for (int h = 0; h < 1152; h++) { 
           g.drawRect(h, 0, (int) (((ampArray[h][j])/maxFreq) * 1152), 
               1); 
           g.fillRect(h, 0, (int) (((ampArray[h][j])/maxFreq) * 1152), 
               1); 
           System.out.println(ampArray[h][j]); 
         } 
       } finally { 
         g.dispose(); 
       } 
     } 
} 

感謝

回答

0

繪畫通常是從從JComponent延伸,通常是JPanel,根據您的需要組件的paintComponent方法內完成。

您應該覆蓋頂層容器paintJFrame用於多種原因,包括他們不是雙緩衝避免,你最終會畫畫的窗口裝飾下,搖擺窗口包含多個層次的組件,這使得中放置一個窗口的可見內容,這意味着你要麼在這個內容上繪製或者在這個內容下面繪製,而這只是一團糟。

你永遠不應該disposeGraphics上下文,你沒有創建自己。

Swing是一個單線程環境,也就是說,任何阻止該線程(如Thread.sleep,將阻止其進程的新重繪請求和事件,使它看起來像你的程序已經停止。

Swing是同樣不是線程安全的,這意味着你需要確保與UI的所有更新和交互從事件指派線程的上下文中完成的。

動畫是通過根據使用的javax.swing.TimerSwingWorker通常實現關於動畫的複雜性,你可以使用Thread,但它比較複雜因爲您需要確保所有的UI更新(直接或其他方式)都是在EDT的環境下手動完成的。

看看: