2012-03-27 84 views
1

現在我正在研究一個程序,它引發了一堆單獨的(在運行時生成的)圖像,每個圖像都在它們自己的窗口中。要做到這一點,我已經試過這種方法:在沒有繼承的情況下繪製到JPanel

public void display(){ 
    JFrame window = new JFrame("NetPart"); 
    JPanel canvas = new JPanel(); 
    window.getContentPane().add(canvas); 
    Graphics g = canvas.getGraphics(); 
    Dimension d = getSize(); 
    System.out.println(d); 
    draw(g,new Point(d.minX*50,d.maxY*50), 50); 
    window.setSize(d.size(50)); 
    window.setResizable(false); 
    window.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    window.setVisible(true); 
} 

public void draw(Graphics g, Point startLoc, int scale){ 
    // generate and draw the image 
} 

public Dimension getSize(){ 
    //returns my own dimensions class 
} 

但是,這將引發NullPointerException異常的平局,聲稱圖形爲空。有沒有辦法從外部向外部繪製JPanel(不是從JPanel繼承並重寫PaintComponent)?任何幫助,將不勝感激。

回答

4

如果您在運行時繪製圖像,則應使用BufferedImage。

創建一個BufferedImage,它調用的getGraphics()來獲得它的圖形對象,使用圖形(2D)API繪製到它,然後調用Graphics.dispose()(不是絕對必要的,但一個良好的習慣),並作爲以前的海報建議要麼使用它創建一個ImageIcon和使用setIcon()來或子類的JPanel/JComponent的放在一個JLabel並繪製它的paintComponent

+0

但是,如何將BufferedImage繪製到JPanel? – 2012-03-27 17:46:23

+0

要在JPanel上繪製BufferedImage,您需要繼承JPanel並在paintComponent方法內調用g.drawImage(myBufferedImage,x,y,...) – ControlAltDel 2012-03-27 19:28:20

4

您發現getGraphics()不會以這種方式工作,因爲在渲染組件之前獲取的Graphics對象爲null,即使它不爲null,也不穩定,並且在每次重繪時都變得無效。可能的選項包括:

  • 從每個Image創建ImageIcon,將圖標放入JLabel並顯示JLabel。
  • 咬住項目符號並擴展JPanel或其他JComponent(不要說你爲什麼試圖避免這種情況),並在JPanel的paintComponent方法中顯示圖像。
  • 這樣做,但首先創建一個顯示在paintComponent(...)方法中的BufferedImage。然後,您可以在程序運行期間修改BufferedImage,如果您需要更改顯示,添加新圖像...
+0

我使用的圖像是在運行時生成的,所以我(據我所知)無法制作imageIcon。我不想擴展JPanel的原因是我的代碼實際上是用於生成圖像背後的結構,並且顯示它們大多隻是一個有用的實用工具(在此之前,我使用了一個複雜的toString,但它已經達到了我無法理解它,所以我創建了這個。如何創建一個BufferedImage來顯示? – 2012-03-27 17:36:31

+0

@g。火箭:你在運行期間無法制作ImageIcon的假設是錯誤的,這應該是有道理的,因爲爲什麼運行的應用程序會阻止創建類?我發現「接受」的答案與我上面的第3點相同。 – 2012-03-27 19:58:18

+0

我知道你可以在運行時從圖像文件(坐在硬盤驅動器)上製作一個ImageIcon,但據我所知我無法自定義繪製到ImageIcon,這正是我想要做的 – 2012-03-27 23:24:28

3
a program that throws up a bunch of separate (generated at runtime) images, 
each in their own window 
  1. 不這樣做,是這樣,不創建大量的JFrames,這些Object停留在內存中,直到當前的JVM實例存在,從這個概念產生的結果很可能是OutOfMemory exceptions

  2. 不會產生大量的JFrames,只創建一個JFrameContainers其餘部分可能是JDialogJWindow

  3. 不創建一個新的JFramesJDialogsJWindows上運行時,re_use現有Containers

  4. 把這些圖像Icon S到JList也許更好的會看CardLayout

相關問題