2012-06-30 16 views
11

Witam Chcę przekonwertować panel, który zawiera komponenty takie jak etykiety i przyciski do pliku obrazu.jak zapisać panel jako obraz w ruchu?

Wykonałem następujący kod. Obraz został zapisany. ale zawartość panelu nie jest widoczna lub zapisana. Czy ktoś może mi powiedzieć, jak zapisać panel za pomocą jego komponentów.

Kod:

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

patrz [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) do wyświetlania widocznych części - przewijania dla ** Patrz również ** & Klasa Roba Camick że zajmuje wiele pracochłonnych prac polega na zrobieniu obrazu ze składnika, który nie został wyświetlony. I niektóre z innych sztuczek do renderowania komponentów przed wyświetlaniem można zobaczyć w [Dlaczego nagłówek JTable nie pojawia się w obrazie?] (Http://stackoverflow.com/q/7369814/418556) –

+1

Wydaje mi się, że jesteś podanie niewłaściwej 'Path' dla pliku, który ma zostać utworzony. Ponieważ Twój Program nic nie wie o tym, czym jest "Dysk E", więc nowy "Plik", który zostanie utworzony, musi mieć odniesienie do 'Względnej Ścieżki' w odniesieniu do' .Pliku pliku', np. '... . \ E: \ Screen.png', sprawiając, że idzie o dwa poziomy wyżej, a następnie dociera do 'Drive E', coś podobnego będzie działać. Obraz tak utworzony z moją odpowiedzią lub odpowiedzią @Alberto jest tworzony obok pliku .class. –

Odpowiedz

17

nNiniejszeja kod działa dla mnie (w 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")); 

Może być używane niestandardowe panele. Jeśli to prawda, spróbuj dodać super.paint(g) na początku metod paint dla paneli.

EDIT: Musisz zadzwonić saveImagepo wyświetlaczu rama:

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

EDIT 2: To jest zapisany obraz (jest niewiele, ponieważ układ, ale jest to dowód, że powinny działać):

enter image description here

Zadzwoniłem saveImage jako ostatnie wywołanie w main i użył pliku w katalogu użytkownika (new File("Screen.png")) jako nIcE cOw powiedział.

+0

Nie używam metody malowania. używam panelu i dodam do niego komponenty. Ale komponenty nie są widoczne podczas zapisywania panelu w obrazie. –

+0

Zobacz moją edycję. Po wyświetleniu ramki musisz wywołać saveImage. – Alberto

+0

Zobacz [ComponentImageCapture.java] (http://stackoverflow.com/a/5853992/418556) do wyświetlania widocznych komponentów - przewiń w dół dla ** Zobacz także ** i klasy A Rob Camick, która wymaga dużo pracy po zrobieniu zdjęcia ze składnika, który nie został wyświetlony. I niektóre z innych sztuczek do renderowania komponentów przed wyświetlaniem można zobaczyć w [Dlaczego nagłówek JTable nie pojawia się w obrazie?] (Http://stackoverflow.com/q/7369814/418556) –

5

Tutaj spróbuj tego przykładowego programu, zamiast używać getGraphics() wydaje się, że musisz użyć createGraphics() dla BufferedImage, który zaraz zrobisz.

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

Zobacz [ComponentImageCapture.java] (http: // stackoverflow.com/a/5853992/418556) do wyświetlania widocznych komponentów - przewiń w dół, aby zobaczyć ** Zobacz także klasę ** i A Rob Camick, która wymaga dużo pracy z robieniem obrazu z komponentu, który nie został wyświetlony. A niektóre z innych sztuczek do renderowania komponentów przed wyświetlaniem można zobaczyć w [Dlaczego nagłówek JTable nie pojawia się w obrazie?] (Http://stackoverflow.com/q/7369814/418556) –

+0

@AndrewThompson: Thankyou for te cenne linki, widziałem to ostatnie pytanie, kiedyś, kiedy dopiero zacząłem się uczyć "Malowania w Swingu", chociaż cała ta sprawa przeszła mi wtedy przez głowę. Ale tym razem mam nadzieję, że będę w stanie nauczyć się ładunków z tych przykładów :-). Znowu dziękuję. Twoje zdrowie –