2011-12-25 76 views
3

我是一個新手繪畫/圖形,並想知道如何將JPanel添加到我的代碼中,這樣整個圖形將在JPanel上,而不是在JFrame上。如何使用jpanel繪畫(或重新繪製)

換句話說,我試圖創建一個圖形用戶界面,可以讓我做到這一點: 右側顯示上左側的JPanel 線的漂亮動作,添加一個JTextArea (在JPanel上)將顯示圖形的協調。

  • 這是一個更大問題的簡化,但我猜這裏的代碼更容易理解。

謝謝!

(如下圖,動線或只需運行該代碼)

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import javax.swing.JFrame; 

public class Test extends JFrame implements Runnable 
{ 
    private Line2D line; 

public Test() 
{ 
    super("testing"); 
    this.setBounds(500, 500, 500, 500); 
    this.setVisible(true); 
} 

public void paint(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.draw(line); 
} 

@Override 
public void run() 
{ 
    int x=50; 
    while (true) 
    { 
     try 
     { 
      Thread.sleep(50); 

      line = new Line2D.Float(100+x, 100+x, 250-x, 260+x%2); 
      x++; 
      repaint(); 
      if (x==5000) 
       break; 

     } catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void main (String args[]) 
{ 
    Thread thread = new Thread (new Test()); 
    thread.start(); 
} 
} 

enter image description here

回答

5
  1. 無需實現Runnable的,建立一個ActionListener調用repaint()。從Swing Timer中調用它。
  2. 有兩種方法可以做到這一點。
    • 擴展JComponentJPanel
    • 繪製在BufferedImage並添加到ImageIconJLabel
  3. 如果擴展組件,請使用JComponent(如果不需要添加更多子項)或使用JPanel(如果需要)。對於覆蓋paintComponent(Graphics)而不是paint(Graphics)
  4. BufferedImage可能是這種用例的更好選擇,因爲它似乎是動畫(假定有意識的持續)系列的線。
  5. Swing GUI應該在EDT上啓動。
  6. 請勿撥打setBounds!相反,將首選大小設置爲自定義組件,爲文本區域的構造函數使用合理值,並將其與佈局(以及適當的填充和邊框)組合,然後在添加所有組件後在框架上調用pack()
  7. 如果JRE在Thread開始之前調用repaint(),則存在NPE。

..What是問題嗎?哦,對,如果可以推斷出問題是「如何將其他組件與自定義繪畫組件結合?」 - 使用嵌套佈局。請參閱Nested Layout example

如果使用BufferedImage作爲後備存儲,您可以把它像這個例子形象,不同之處在於你會離開上面的JTable,還有JSplitPane

+0

謝謝!我擴展了JPanel,並使用了paintComponent,這個技巧是 – adhg 2011-12-26 19:22:08

+0

,今天我學到了2件東西。再次感謝 – adhg 2011-12-27 01:32:15

+0

不客氣。 :-)在這兩個方面。 ;) – 2011-12-27 01:47:28