vendredi 13 mars 2015

JAVA: Screenshot after JFrame change just black



I've written a program which makes a screenshot of JFrame by clicking on JMenuItem. If I only run the .java file in Eclipse, everything works and the screenshot shows the JFrame perfectly. But if I open the JFrame as a link from another JFrame, the screenshot is black instead of showing the JFrame. Here's my code:


JFrame1.java:



import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;


public class JFrame1 extends JFrame {

static JFrame1 frame1 = new JFrame1();

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

public void run() {
try {
frame1.setVisible(true);

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

}
});
}

public void CloseFrame(){
super.dispose();
}

public JFrame1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 800, 740);

JButton ok = new JButton("OK");
getContentPane().add(ok);
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CloseFrame();
JFrame2 frame2 = new JFrame2();
frame2.setVisible(true);
}
});
}
}


With a button (ok) I can go to JFrame2.java.


JFrame2.java:



import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class JFrame2 extends JFrame {

static JFrame2 frame2 = new JFrame2();

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

public void run() {
try {
frame2.setVisible(true);

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

}
});
}

private void createMenuBar() {

JMenuBar menubar = new JMenuBar();

JMenu file = new JMenu("File");

JMenuItem screen = new JMenuItem("Screenshot");
screen.addActionListener(new AbstractAction() {

@Override
public void actionPerformed (ActionEvent e)
{
Dimension size = frame2.getSize ();
BufferedImage img = new BufferedImage (size.width, size.height, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = img.getGraphics ();
frame2.printAll (g);
g.dispose ();
try
{
ImageIO.write (img, "png", new File ("screenshot.png"));
}
catch (IOException ex)
{
ex.printStackTrace ();
}
}
});

file.add(screen);
menubar.add(file);
setJMenuBar(menubar);
}

public JFrame2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 800, 740);

createMenuBar();
}

}


If I click now on "Screenshot", it is just black. And if I run only JFrame2.java without running JFrame1.java before, the real image is saved. Why does the screenshot is black after going from one JFrame1 to JFrame2?




Aucun commentaire:

Enregistrer un commentaire