2012-06-30 29 views
11

Xin chào, tôi muốn chuyển đổi bảng điều khiển chứa các thành phần như nhãn và nút vào tệp hình ảnh.cách lưu bảng điều khiển dưới dạng hình ảnh trong xoay?

Tôi đã thực hiện mã sau đây. Hình ảnh đã được lưu. nhưng nội dung của bảng điều khiển không hiển thị hoặc được lưu. Bất cứ ai có thể cho tôi biết làm thế nào để lưu bảng điều khiển với các thành phần của nó.

Code:

package PanelToImage; 

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class sample extends JPanel { 

public JPanel firstpanel; 
public JPanel secondpanel; 
JLabel label1, label2; 
JButton button1, button2; 

public sample() { 
    firstpanel = new JPanel(); 
    firstpanel.setSize(400,300); 
    firstpanel.setBackground(Color.RED); 
    secondpanel = new JPanel(); 
    secondpanel.setBackground(Color.GREEN); 
    secondpanel.setSize(400,300); 

    label1 = new JLabel("label1"); 
    label2 = new JLabel("label2"); 
    button1 = new JButton("button1"); 
    button2 = new JButton("button2"); 

    firstpanel.add(label1); 
    firstpanel.add(button1); 

    secondpanel.add(label2); 
    secondpanel.add(button2); 

    saveImage(firstpanel); 

    add(firstpanel); 

    // add(secondpanel); 
} 

public static void main(String args[]) { 

    JFrame frame = new JFrame(); 
    sample sam = new sample(); 
    frame.setContentPane(sam); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 300); 

} 

private void saveImage(JPanel panel) { 
    BufferedImage img = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB); 
    panel.paint(img.getGraphics()); 
    try { 
     ImageIO.write(img, "png", new File("E://Screen.png")); 
     System.out.println("panel saved as image"); 

    } catch (Exception e) { 
     System.out.println("panel not saved" + e.getMessage()); 
    } 
} 
} 
+0

Xem [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) để hiển thị các thành phần hiển thị - cuộn xuống để xem ** Xem thêm ** & Lớp A của Rob Camick rất nhiều công việc grunt trong việc chụp ảnh từ một thành phần chưa được hiển thị. Và một số thủ thuật khác để hiển thị các thành phần trước khi hiển thị có thể được nhìn thấy trong [Tại sao tiêu đề JTable không xuất hiện trong hình ảnh?] (Http://stackoverflow.com/q/7369814/418556) –

+1

Dường như với tôi bạn là cung cấp sai 'Đường dẫn' cho tệp được tạo. Vì chương trình của bạn không biết gì về 'Drive E', nên' File' mới sẽ được tạo ra phải được tham chiếu với 'Relative Path' liên quan đến' .class File', như '.. \. \ E: \ Screen.png', làm cho nó đi hai cấp độ và sau đó tiếp cận cho 'Drive E', một cái gì đó như thế này sẽ làm việc. Hình ảnh được tạo ra với câu trả lời của tôi hoặc câu trả lời của @Alberto được tạo bên cạnh tệp .class. –

Trả lời

17

tthis đang làm việc cho tôi (trong JFrame):

Container c = getContentPane(); 
BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); 
c.paint(im.getGraphics()); 
ImageIO.write(im, "PNG", new File("shot.png")); 

Có lẽ bạn đã sử dụng tấm pin tùy chỉnh. Nếu đúng, hãy thử thêm super.paint(g) vào đầu phương thức paint của các bảng của bạn.

EDIT: Bạn phải gọi saveImagesau hiển thị khung:

public static void main(String args[]) { 
    ... 
    frame.setSize(400, 300); 
    sam.saveImage(sam.firstpanel); 
} 

EDIT 2: Đây là hình ảnh được lưu (rất ít vì cách bố trí, nhưng là bằng chứng cho thấy nó nên làm việc):

enter image description here

tôi gọi là saveImage là cuộc gọi cuối cùng trong số main và sử dụng tệp trong thư mục người dùng (new File("Screen.png")) là nIcE cOw cho biết.

+0

Tôi không sử dụng phương pháp vẽ. i m chỉ cần sử dụng bảng điều khiển và thêm các thành phần với nó. Nhưng các thành phần không hiển thị trong khi lưu bảng điều khiển vào hình ảnh. –

+0

Xem chỉnh sửa của tôi. Bạn phải gọi saveImage sau khi khung được hiển thị. – Alberto

+0

Xem [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) để hiển thị các thành phần hiển thị - cuộn xuống để xem ** Xem thêm ** & Lớp A của Rob Camick, có rất nhiều công việc grunt chụp ảnh từ một thành phần chưa được hiển thị. Và một số thủ thuật khác để hiển thị các thành phần trước khi hiển thị có thể được nhìn thấy trong [Tại sao tiêu đề JTable không xuất hiện trong hình ảnh?] (Http://stackoverflow.com/q/7369814/418556) –

5

Ở đây, hãy thử chương trình mẫu này, thay vì sử dụng getGraphics() có vẻ như bạn phải sử dụng createGraphics() cho số BufferedImage bạn sắp thực hiện.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class SnapshotExample 
{ 
    private JPanel contentPane; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Snapshot Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     contentPane = new JPanel(); 
     contentPane.setOpaque(true); 
     contentPane.setBackground(Color.WHITE); 
     JLabel label = new JLabel("This JLabel will display" 
         + " itself on the SNAPSHOT", JLabel.CENTER); 
     contentPane.add(label); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     makePanelImage(contentPane); 
    } 

    private void makePanelImage(Component panel) 
    { 
     Dimension size = panel.getSize(); 
     BufferedImage image = new BufferedImage(
        size.width, size.height 
           , BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = image.createGraphics(); 
     panel.paint(g2); 
     try 
     { 
      ImageIO.write(image, "png", new File("snapshot.png")); 
      System.out.println("Panel saved as Image."); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      {   
       new SnapshotExample().displayGUI(); 
      } 
     }); 
    } 
} 
+0

Xem [ComponentImageCapture.java] (http: // stackoverflow.com/a/5853992/418556) để hiển thị các thành phần hiển thị - cuộn xuống cho ** Xem thêm ** & Lớp A của Rob Camick, có rất nhiều công việc khó chịu khi chụp ảnh từ một thành phần chưa được hiển thị. Và một số thủ thuật khác để hiển thị các thành phần trước khi hiển thị có thể được nhìn thấy trong [Tại sao tiêu đề JTable không xuất hiện trong hình ảnh?] (Http://stackoverflow.com/q/7369814/418556) –

+0

@AndrewThompson: Thankyou for những liên kết quý giá này, tôi đã thấy câu hỏi cuối cùng, một lần trước khi tôi mới bắt đầu học 'Tranh trong Swing', mặc dù toàn bộ điều đó đã vượt qua đầu tôi vào lúc đó. Nhưng lần này hy vọng tôi có thể tìm hiểu các tải từ những ví dụ sau :-). Thankx lần nữa. Chúc mừng –

Các vấn đề liên quan