2012-09-19 18 views
1

我想從JPanel創建一個BufferedImage,而不使用JFrame。昨天,我終於能夠在這個社區的幫助下看到圖像(見下文),但現在我遇到了一些佈局問題。 BufferedImage上的所有組件都從0,0開始繪製,而不是跟隨佈局管理器。有誰知道這個問題的解決方案?當從JPanel創建BufferedImage(不帶JFrame)時,我也可以使用佈局管理器嗎?

昨天的問題:Can I create a BufferedImage from a JPanel without rendering in a JFrame?

在下面的代碼,這兩個標籤將在圖像的左上角相互覆蓋。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class RenderTest { 

     RenderTest() { 
     JPanel panel = new JPanel(); 
     panel.setBackground(Color.RED); 
     panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
     Dimension dim = new Dimension(150,50); 
     panel.setSize(dim); 
     panel.setMinimumSize(dim); 
     panel.setMaximumSize(dim); 
     panel.setPreferredSize(dim); 
     JLabel label = new JLabel("hello"); 
     JLabel label2 = new JLabel(" world"); 
     label.setSize(label.getPreferredSize()); 
     label2.setSize(label2.getPreferredSize()); 
     panel.add(label); 
     panel.add(label2); 

     BufferedImage bi = getScreenShot(panel); 
     JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi))); 
    } 

    private BufferedImage getScreenShot(JPanel panel){ 
     BufferedImage bi = new BufferedImage(
      panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     panel.paint(bi.getGraphics()); 
     return bi; 
    } 

    public static void main(String[] args) { 
     new RenderTest(); 
    } 
} 
+0

(笑)我最初的懷疑結果是錯誤的。呃..好的。這一切的最終目的是什麼?你希望提供什麼用戶功能?我可以想到幾種不同的方法來實現各種功能。 –

+0

我正在爲我正在處理的項目繪製BufferedImages,逐個像素。然後我需要將相應的縮放比例,標題信息等添加到要保存到PowerPoint幻燈片的圖像中。目前,我通過將所有內容放在JPanel上,獲取該面板的「截圖」,並使用Apache POI將該BufferedImage保存到PowerPoint幻燈片來設置它。那有意義嗎?有沒有另一種我沒有想到的方式? – Brooke

+0

很好的解釋。看看我的最新答案是否適合你。 –

回答

4

更多tips from the queen。 '致電addNotify()'。

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class RenderTest { 

    RenderTest() { 
     JPanel panel = new JPanel(new GridLayout(0,1,10,10)); 
     panel.setBackground(Color.RED); 
     panel.setBorder(new EmptyBorder(5,25,5,25)); 

     JLabel label = new JLabel("hello"); 
     panel.add(label); 
     JLabel label2 = new JLabel("goodbye"); 
     panel.add(label2); 

     panel.addNotify(); 
     panel.setSize(panel.getPreferredSize()); 
     panel.validate(); 

     BufferedImage bi = getScreenShot(panel); 
     JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi))); 
    } 

    private BufferedImage getScreenShot(JPanel panel){ 
     BufferedImage bi = new BufferedImage(
       panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     panel.paint(bi.getGraphics()); 
     return bi; 
    } 

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

順便說一句 - 我不會推薦大小設置爲任意尺寸,然後嘗試結合起來,與佈局。只是想我會提到,因爲我得到的是你想要的印象。在這種情況下,我們可能確定所有事情的方向,以便選擇一種方法,但選擇一種方法或另一種方法。

+0

+1,但我認爲JPanel不是isDisplayable,那麼必須尋找hack – mKorbel

+0

它看起來會起作用,但它對尺寸有點挑剔。你能給我一個你的意思(關於任意維度)的簡單例子嗎?我不確定我明白。 – Brooke

+0

HOORAY!有效!這幾天我一直在搞這個!非常感謝你們! – Brooke

0
JLabel label = new JLabel("hello"); 
panel.add(label); 
JLabel label2 = new JLabel("goodbye"); 
panel.add(label2); 

這可能是一個系統請求過程?

我不確定,但樹看起來可能。

+0

請求?這個問題並沒有提供很多幫助來回答問題。 –

相關問題